기본 콘텐츠로 건너뛰기

추천 가젯

리눅스 홈서버 알림용 텔레그램 봇(Telegram Bot) 연동 및 쉘 스크립트 구축 가이드

개인 홈서버를 운영하다 보면 백업 완료 여부나 시스템 에러 같은 단방향 알림을 스마트폰으로 빠르게 받아보고 싶어집니다. 외부 메일 서버나 복잡한 SMTP 설정을 거치지 않고, 가장 확실하고 가볍게 쓸 수 있는 텔레그램 봇을 이용한 홈서버 알림 구축 방법 을 정리합니다. 1단계: 텔레그램 봇 생성하기 (BotFather) 텔레그램 앱을 켜고 상단 검색창에 BotFather 를 검색하여 공식 봇(파란색 체크마크 확인)을 엽니다. 대화창에 아래 명령어를 입력하여 새로운 봇을 만듭니다. Plaintext /newbot 봇의 이름(Name)을 입력합니다. (예: My Home Server Bot ) 봇의 아이디(Username)를 입력합니다. (반드시 영문이며 끝에 bot 또는 _bot 으로 끝나야 합니다. 예: my_home_backup_bot ) 생성이 완료되면 HTTP API 토큰(Token)이 발급됩니다. 이 토큰을 안전하게 보관합니다. 2단계: 내 Chat ID(채팅방 고유 번호) 확인하기 텔레그램은 보안상 사용자가 먼저 봇에게 말을 걸어야 메시지를 받을 수 있으며, 봇이 나에게 메시지를 보내려면 고유 Chat ID 가 필요합니다. 텔레그램 검색창에 userinfobot 을 검색하여 들어갑니다. 하단의 [시작하기] 버튼을 누르면 내 계정의 정보와 함께 Id (숫자) 값을 알려줍니다. 이 숫자를 복사해 둡니다. [중요] 1단계에서 만든 내 봇의 아이디(예: @my_home_backup_bot )를 검색해서 대화창을 열고, [시작] 버튼을 누르거나 아무 메시지나 먼저 한 번 전송해 둡니다. 3단계: 리눅스 쉘 스크립트 작성 및 테스트 서버(터미널)에서 환경변수를 설정하고 curl 명령어를 통해 테스트 메시지를 보낼 수 있습니다. 특히 인자값이 없을 때를 대비해 기본값 처리를 해두면 유용합니다. 아래 내용을 포함하는 쉘 스크립트 파일(예: send_telegram.sh )을 작성합니다. Bash #!/bin/bash # 환경변수 설정 (실제 토큰과 C...

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

 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 서브루틴의 대한 말도 있는데, 랜덤함수는 여러군데서 호출되므로 임의로 조작할수는 없다고 한다.



댓글