이 블로그 검색

2023년 4월 3일 월요일

인터넷에 올라온 순대국밥집 가격표와 국민총소득을 함께 그려보았다.

일단 순대국 가격은 매우 합리적이다. 국가의 성장과 함께 같이 성장해왔다. 

국밥 가격이 지나치가 쌌던 것일까... 

일단 국민 총소득 자료 통계청 자료 받아다가 놨으니 이런 이슈가 있을 때 커뮤니티에 올려야겠다. 

500원 1000원 단위로 가격을 올려서 그렇지, 나름 가격 대응을 잘 해나가고 있는 것 같고, 

최저임금으로 고용이 아니라 일당제 아줌마나 가족 경영체계면 지금도 수익을 내는데는 문제가 없어보인다. 

아마 근래에 들어서 국밥 한끼가 든든하다는 이야기가 나온건, 그냥 2010년대부터 진짜로 싸서 그랬던게 아닌가 싶다. 그냥 경제수준에 맞는 음식이었는데, 2010년부터 상대적으로 서민의 음식이 되었다. 






80대부터 2010년에 이르기까지 경제성장과 함께 가격이 올랐으며, 1980년 이전에는, 국가의 성장이 개인의 성장에 못미친게 맞는지... 가격이 지나치게 싼 것 같다. 뭐... 머리카락 팔고 인재 팔아가지고 GDP올라봐야 개인들 삶이 얼마나 나아졌을까... 

2023년 4월 1일 토요일

Homm3 모드(MOD) 조각 개발 기획서. - 임프(패밀리어) 자기 희생 특기., 데빌-강제희생

{0x59F63B, (long)MovingMonsters8, H_LONG}, // sacrifice select whom to revieve
{0x59F65A, (long)MovingMonsters9, H_LONG}, // sacrifice select whom to kill
이미 있다. option 759 - Devils sacrificing.erm
을 참조하면 되겠고, 임프만 어떻게 하면 되려나.
SOD3.2와 WOG의 해당 커맨드 주소를 알게되어 기획 가능.

임프는 자기를 희생해서 우리편을 살릴 수 있음. 
패밀리어는 자기를 희생해서 우리편을 살릴 수 있음(
    차이점이 필요함.
    1. 패밀리어만 가능하게 한다. 
    2. 우리편을 살리는데 필요한만큼만 희생한다. 
    3. 부활 불가능하지만 시체를 남긴다. (!!) 핏로드와 연계 가능 최종목표는 여기로하자.
당장은 해당 기능은 불가능하므로 2번을 가능하도록 코딩을 하자.
ERM에 해당 명령은 존재하지만 살짝 고쳐야하므로, c/c++를 좀 만져야함. 
필요한만큼의 희생은 부활마법에서 잃은 체력을 계산할 수 있음.
그 다음 필요한 패밀리어의 수를 계산할 수 있음. 
이 방법을 쓰면 부활 불가능을 위해서, 초기 전투시 시작 유닛의 숫자 부분을 고치는 코드가 필요함!!

데빌특기 우리편 강제희생.- 
임프 특기랑 결국은 같은 방향. 인퍼노 최하층 1레벨은 알아서 희생하는 역할, 7레벨은 남을 희생시켜서라도 자기가 오래사는 역할!!로 해서 희생마법의 두 특징을 나누어서 사용가능하게 하는게 목표. 
최고의 이기주의를 방향으로하고, 기본체력이 작으므로, 행동스택을 잃지 않고 희생시킨 후, 원래대로 전투를 가능하게하거나, 
우리편에 데빌이 있으면, 다른 유닛들한테 그런특기가 가능한 것 처럼 바꾸는 방향도 가능.


WOG관련 코드에서 __newcallers가 어떤 구조인지 알아야함. 
첫번째가 주소인것 같으나 offset이 있을 수 있음. 두번째는 리턴(&함수이름)의 형태로 보임 하지만 정확치 않음, 3번째는 함수형태를 말하는듯함. H_CALL5는 5개 변수를 받는 STDCALL또는 FASTCALL일 것. 
그러면 H_LONG은 무엇일까? LONG하나를 받는 함수일 것인가. 아 롱점프인듯하다. 
LJMP니까 절대 주소가 맞고, HOTA도 같은 위치일 수 있겠음.  같은위치 맞는듯.
Long jump로 이름없는 함수로 뛰는데 이름없는 함수는 ghidra에서도 네이밍을 해주기까 까다로움.
코맨트를 열심히 달아놔야 할 것으로 보임.
졸업준비로 바빠서 기획서만 쓰고 마침.

2023년 2월 24일 금요일

beamer로 presentation 하기.

 


Beamer 작성법

latex code  preamble에  다음을 추가합니다. 

\usepackage{pgfpages}
\setbeameroption{show notes}
\setbeameroption{show notes on second screen=right}

위처럼 작성하면, PDF파일 오른쪽에 노트가 붙어서 나옵니다. 



3:4면 3:8로 나옵니다. 보통은 bottom으로 해서 handout으로 준비하는데 사용한다고 볼 수 있습니다. 

파일 준비는 끝났습니다. 

뷰어 

이제 이걸 어떻게 볼지가 중요합니다. 해당하는 application은 또 누군가 만들어 놨습니다. 

pdf-presenter-console  ->>(fork)->> pdfpc 

위 프로그램을 사용하면 쉽게 presentation이 가능합니다. 



가로 화면과 새로 화면이 섞여서 이상하게 보이긴 하는데 오른쪽 화면이 청중용 2/3왼 쪽이 발표자용이다. 현재 페이지 다음장, 그리고 노트가 표시되고, 이전화면도 볼 수 있다. 

pdf-presenter-console --notes=right main_with_note.pdf

 이 툴을 사용하면 남은시간 쉽게 표시할 수 있다. 

상황이 여의치 않을 때는 web을 이용할 수 있는데, 

https://beamerviewer.pacien.org/

이 링크를 이용하면 간단하게 사용가능하다. 





파일을 선택하면, 다음처럼 두개의 창을 띄울 수 있다. 


원하는 대로 배치해서 사용하면 되겠다. 

2023년 2월 15일 수요일

Xournalpp 에서 수식에 색상 넣는법.. 의외로 간단.

 

자세히 latex sample 파일을 보면,

%%XPP_TEXT_COLOR%% 라는 데이터를 얻어서, 색상이 있는 수식을 출력 한다고 한다.

선을 그리다가, 빨간 수식을 넣고 싶어서 누르면, 해당하는 값이 나오지 않는다. 

그래서, 버그라고 생각하고, git 레포지토리를 고치고 이상한 짓거리를 많이 한 후 한가지를 알아냈다.



아... TEXT_COLOR니까 text box object를 누르고 색상을 바꾼후, 수식을 쓰면 색상이 올바로 나온다.

이 과정중에 cpp의 멋짐을 또보게 된다. 


\definecolor{colorname}{HTML}{6hexcode_color}

 s << std::hex << std::fill(0) << std::setw(6) <<std::right << colorClass;


colorClass {

.....char transparent,red,green,blue;

    operator int32_t() {

        re = (transparent  << 24) | (red << 16) | (green <<8)| (blue)   ) ;

    }

}

   

6hexcode_color  = s.rawtext(); 와 같은 식의... 출력...

c방식의 사고방식이 머리에 차있어서 이런거 볼 때마다 너무 멋짐.


2023년 1월 10일 화요일

던전앤드래곤 쉐도우오브미스타라 법사찌르기 랜덤 데미지 공식.

 Reference[1] 

https://dammit.typepad.com/blog/2011/01/ddsom-critical-hits-random-numbers.html



위 블로그에서 법사찌르기 랜덤데미지를 찾았다.


법사의 강공력은 다른 캐릭터처럼 1.5배의 데미지를 주는것이 아닌, 1도트의 데미지만 주다가 한번씩 엄청난 데미지가 주어진다.

사실 이 문제에 관심을 가진 것은 아니고, ddsom의 무기 공격력 테이블이나, 각 캐릭터별 레벨명 공격력 변경값 같은걸 찾으려고 ddsom + offset +memory  로 검색을 하다가 나온 것이다. 

일단 더 많은 정보는 없었고, 히트박스 관련글이 있었으나 이 부분은 관심이 없다. 



위 블로그 주인장은, 적 유닛의 체력값의 주소를 기억하고 해당 주소값의 데이터를 변경하는 함수 콜을 추적한 것으로 보인다. 


사실 내가 필요 한게 저 메모리주소리스트 들인데 설명을 위한거 말고는 없어서 아쉽다. 


Register A0는 player base 0xff75de(for Player 1) 이고 A1은 공격대상의 베이스라고 한다. (0xFFBA1E for boses) 라고 하는데 무슨 소리인지 잘모르겠다. 저기 있는 메모리 값을 저 레지스터로 읽어온다는 것이겠지.

(저 부분의 코드가 호출 될 때 레지스터에 저게 올라가 있다는건지... )

$19a88.l 이라는 서브루틴은  D0에 2바이트 랜덤넘버를 심는 서브루틴이라고 한다. 
랜덤함수는 알면 게임의 랜덤성을 이용하는데 모두 접근 할 수 있어 좋다. 

작은 바이트의 반만 사용한다라고 써놓고는 나중에는 또 다른 반바이트를 써서 좋 1바이트를 쓴다.

$3ec0와 $3ed4는 테이블 룩업을 하는거라는데 잘 모르겠다. 

아래에 테이블 룩업을 테이블로 표시해놨는데 

그냥 이건 그대로 가져왔다. 


Table Ref[1]

random number
D0 at $3EBE
D4 at $3EC4random number
D0 at $3ED2
D4 at $3ED8
0x0 - 0xA0xFFn/a
0xB - 0xC0x000x0 - 0x50x02
0x6 - 0xF0xFF
0xD - 0xE0x100x0 - 0x30x01
0x4 - 0xF0xFF
0xF0x200x0 - 0x10x00
0x2 - 0xF0xFF



3EBE의 하프바이트를 통해서 3ec4의 값을 설정 하는데 내부 계산을 위해쓰이는거 같고,
다음 D0 at $3ED2의 테이블 룩업을 통해   0,1,2 값을 얻고 그 외에는 1도트 데미지를 주게하고,

0,1,2값을 얻었을 때는 적의 전체HP에다가 저 숫자를 shift-right-bit? 연산을 한다. 

그 결과 다음과 같은 결과를 얻는다. 

full damage1/16 x 2/161/1280.78%
1/2 damage2/16 x 4/164/1283.13%
1/4 damage2/16 x 6/166/1284.69%
1 point damage128/128 - 1/128 - 4/128 - 6/128117/12891.5%


의외로 8.5%의 확률로 빅데미지가 들어간다. 10번 때려서 1/4이상 데미지를 줄 수 있다면 딱히 찌르는데 목적을 둘 필요는 없다. (그냥 콤보용) 여럿이 할 수록 적의 체력이 많아지므로 보스잡는데는는 역시 확실하다. 

음 나중에 테스트로 랜덤함수 결과 나오는 부분을 건드리면, 저게 잘 적용되는지 확인할 수 있을거로 보이지만 지금 당장은 이거할 여유가 없다. 

이어서 뭐 이소리 저소리 있는데  적의 체력은 최대 1000 까지인데, 최대데미지 99제한 코드가 7바이트 연산으로 처리되어서, 100-127일 때만 99로 줄어들고 나머지는 정상적용이라고 한다. 

또 rng 서브루틴의 대한 말도 있는데, 랜덤함수는 여러군데서 호출되므로 임의로 조작할수는 없다고 한다.



2022년 12월 2일 금요일

Libreoffice Calc에서 Libreoffice base로 또는 SQL로 데이터 넣는 방법.

복사해서 붙여넣기로 하면서 에러가 나는 경우가 몇번 있었어서, Sql query 만들어서 하는 방법을 택하였다. SQL query를 만들 때 가장 문제는 문자형의 경우는 "" 로 싸거나, ''로 싸거나 하는 경우가 많다는거다, 그래서 필요한 함수를 먼더 만들어야한다.
도구 >> 매크로 >> edit 매크로
다음과 같은 Basic 함수를 만들어주자.
function dquoted(Optional x)
  Dim iRow As Integer
  Dim iCol As Integer
  DIM resultString As String 
  resultString = ""
 
  If NOT IsMissing(x) Then
    If NOT IsArray(x) Then
resultString =  Chr(34) & x &Chr(34)
Else
      For iRow = LBound(x, 1) To UBound(x, 1)
        For iCol = LBound(x, 2) To UBound(x, 2)
          resultString = resultString &", "  & Chr(34) & x(iRow,iCol) &Chr(34)
        Next
      Next
    End If
  End If
  dquoted = resultString
end function
여러칼럼의 문자 칼럼이 있다면, 쓸 수 있도록 해주었다. 그 다음 부터야 간단하다. 앞 셀에는 insert into tablename ( 를 넣고, 다음 칼럼이 숫자면 그냥 =해당 데이터로 그대로 복사해준다. 문자열로 이루어진 칼럼은 위 함수를 사용해서 =dquoted( 해당 문자열 또는 문자열 어레이) 를 해준다. 이런 식의 반복 후 마지막 데이터 칼럼 뒤에 ); 을 넣어준다. 그 다음에 =concat( insert into 셀부터 ); 까지 선택 그 다음쿼리를 다 선택후 끌어내려서 채우기를 한 후, concat 셀을 모두 선택한 후, base에 가서 sql 명령어 넣기를 하면 자료가 들어간다.

가장 많이 본 글