; Artifact settlement owns caps, inventory and observer/tower isolation. PreviewArtifactSignature3D PROC uses esi ecx source:DWORD mov esi,source mov ecx,9 mov eax,0A57C0DEh preview_artifact_sign: rol eax,5 xor eax,[esi] add eax,9E3779B9h add esi,4 loop preview_artifact_sign ret PreviewArtifactSignature3D ENDP ArtifactSaveSignature3D PROC uses esi ecx edx source:DWORD mov esi,source mov ecx,SAVE_ARTIFACT_SIGN_SIZE/4 mov eax,0A57C0DEh artifact_sign_word: rol eax,5 xor eax,[esi] mov edx,eax shr edx,16 xor eax,edx add eax,9E3779B9h add esi,4 loop artifact_sign_word ret ArtifactSaveSignature3D ENDP ValidateArtifactSave3D PROC uses esi edi source:DWORD mov esi,source cmp DWORD PTR [esi+280],32465241h jne artifact_save_invalid mov eax,[esi+304] and eax,0FFFCFFFFh cmp eax,2 jne artifact_save_invalid test DWORD PTR [esi+304],20000h jz @F test DWORD PTR [esi+304],10000h jz artifact_save_invalid @@: invoke ArtifactSaveSignature3D,esi cmp eax,[esi+308] jne artifact_save_invalid mov edi,284 @@: cmp DWORD PTR [esi+edi],99 ja artifact_save_invalid add edi,4 cmp edi,300 jb @B cmp DWORD PTR [esi+300],15 ja artifact_save_invalid mov eax,1 ret artifact_save_invalid: xor eax,eax ret ValidateArtifactSave3D ENDP ArtifactCredit3D PROC amount:DWORD mov eax,1000000000 sub eax,bankroll cmp eax,amount jbe @F mov eax,amount @@: add bankroll,eax ret ArtifactCredit3D ENDP ResetArtifacts3D PROC mov brOwned3D,0 mov brEnabled3D,1 mov charmCloverUses,0 mov charmHorseshoeUses,0 mov charmSkullUses,0 mov charmDevilUses,0 mov charmEnabledMask3D,7 ret ResetArtifacts3D ENDP ClampArtifacts3D PROC uses esi ecx lea esi,charmCloverUses mov ecx,4 @@: cmp DWORD PTR [esi],CHARM_MAX_USES jbe artifact_clamp_next mov DWORD PTR [esi],CHARM_MAX_USES artifact_clamp_next: add esi,4 loop @B and charmEnabledMask3D,15 test charmEnabledMask3D,8 jz @F and charmEnabledMask3D,12 @@: ret ClampArtifacts3D ENDP ToggleArtifact3D PROC index:DWORD mov ecx,index cmp ecx,3 ja artifact_toggle_done btc charmEnabledMask3D,ecx cmp ecx,3 jne @F test charmEnabledMask3D,8 jz artifact_toggle_save and charmEnabledMask3D,12 jmp artifact_toggle_save @@: cmp ecx,2 je artifact_toggle_save and charmEnabledMask3D,7 artifact_toggle_save: call SaveProgress3D artifact_toggle_done: ret ToggleArtifact3D ENDP TriggerCharmLossProtection PROC uses ebx ecx edx betAmount:DWORD cmp obsActive3D,0 jne artifact_loss_none cmp tournamentMode,0 jne artifact_loss_none cmp betAmount,0 je artifact_loss_none test charmEnabledMask3D,8 jz artifact_loss_clover cmp charmDevilUses,0 je artifact_loss_none dec charmDevilUses call SaveProgress3D jmp artifact_loss_none artifact_loss_clover: test charmEnabledMask3D,1 jz artifact_loss_none cmp charmCloverUses,0 je artifact_loss_none mov eax,betAmount inc eax shr eax,1 cmp eax,10000 jbe @F mov eax,10000 @@: invoke ArtifactCredit3D,eax test eax,eax jz artifact_loss_none dec charmCloverUses invoke CopyString3D,OFFSET msgCharmCloverSave,OFFSET flashMessage mov flashTimer,140 call SaveProgress3D mov eax,1 ret artifact_loss_none: xor eax,eax ret TriggerCharmLossProtection ENDP ; Input is NET profit, never gross payout or returned stake. TriggerCharmWinBonus PROC uses ebx ecx edx winAmount:DWORD cmp obsActive3D,0 jne artifact_bonus_none cmp tournamentMode,0 jne artifact_bonus_none cmp winAmount,0 je artifact_bonus_none test charmEnabledMask3D,8 jz artifact_bonus_horse cmp charmDevilUses,0 je artifact_bonus_none mov eax,winAmount cmp eax,10000 jbe @F mov eax,10000 @@: invoke ArtifactCredit3D,eax test eax,eax jz artifact_bonus_none dec charmDevilUses mov ebx,eax invoke CopyString3D,OFFSET msgCharmDevilSave,OFFSET flashMessage jmp artifact_bonus_save artifact_bonus_horse: test charmEnabledMask3D,2 jz artifact_bonus_none cmp charmHorseshoeUses,0 je artifact_bonus_none mov eax,winAmount mov ecx,35 mul ecx mov ecx,100 div ecx test eax,eax jnz @F inc eax @@: cmp eax,5000 jbe @F mov eax,5000 @@: invoke ArtifactCredit3D,eax test eax,eax jz artifact_bonus_none dec charmHorseshoeUses mov ebx,eax invoke CopyString3D,OFFSET msgCharmHorseshoeWin,OFFSET flashMessage artifact_bonus_save: mov flashTimer,140 call SaveProgress3D mov eax,ebx ret artifact_bonus_none: xor eax,eax ret TriggerCharmWinBonus ENDP TriggerCharmBulletProtection PROC cmp obsActive3D,0 jne artifact_bullet_none cmp tournamentMode,0 je artifact_bullet_normal cmp towerBulletUses3D,0 je artifact_bullet_none dec towerBulletUses3D invoke CopyString3D,OFFSET towerBulletMessage3D,OFFSET flashMessage mov flashTimer,140 mov eax,1 ret artifact_bullet_normal: test charmEnabledMask3D,4 jz artifact_bullet_none cmp charmSkullUses,0 je artifact_bullet_none dec charmSkullUses invoke CopyString3D,OFFSET msgCharmSkullSave,OFFSET flashMessage mov flashTimer,140 call SaveProgress3D mov eax,1 ret artifact_bullet_none: xor eax,eax ret TriggerCharmBulletProtection ENDP