Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool OnSidePlatform(int x, int y, int xOff, int yOff, int h, int w) {
- for(int i =0;i<=w-1;i++){
- if(Screen->isSolid((x+xOff+i),(y+yOff)+h)
- && Screen->Flags[SF_ROOMTYPE]&4)
- return true;
- }
- return false;
- }
- void __UpdateEWMThrow(eweapon wpn)
- {
- // __EWI_WORK: Current jump
- // __EWI_WORK_2: Current Z position
- // __EWI_MOVEMENT_ARG: Initial jump
- // __EWI_MOVEMENT_ARG_2: Flags
- wpn->Jump=0; // Override engine handling of Z movement
- // Just thrown
- if(wpn->Misc[__EWI_WORK]==0 && wpn->Misc[__EWI_MOVEMENT_ARG]!=0)
- {
- wpn->Misc[__EWI_WORK]=wpn->Misc[__EWI_MOVEMENT_ARG];
- wpn->Misc[__EWI_MOVEMENT_ARG]=0;
- }
- // Fall
- wpn->Misc[__EWI_WORK_2]=Max(wpn->Misc[__EWI_WORK_2]+wpn->Misc[__EWI_WORK], 0);
- if(!IsSideview())
- wpn->Z=wpn->Misc[__EWI_WORK_2];
- else
- wpn->Y = 176-wpn->Misc[__EWI_WORK_2];
- // Hit the ground
- // Still in the air; adjust velocity
- if(wpn->Misc[__EWI_WORK_2]>0 &&
- !OnSidePlatform(wpn->X, wpn->Y,
- wpn->HitXOffset,
- wpn->HitYOffset,
- wpn->HitHeight,wpn->HitWidth)) // Z>0
- wpn->Misc[__EWI_WORK]=Max(wpn->Misc[__EWI_WORK]-GH_GRAVITY, -GH_TERMINAL_VELOCITY);
- // Hit the ground
- else
- {
- bool done=false;
- // Bounce
- if((wpn->Misc[__EWI_MOVEMENT_ARG_2]&EWMF_BOUNCE)!=0)
- {
- // Falling fast enough?
- if(wpn->Misc[__EWI_WORK]<-0.5) // Jump<=-0.5
- {
- wpn->Misc[__EWI_WORK]*=-0.5;
- wpn->Step*=0.75;
- }
- // Not fast enough
- else
- done=true;
- }
- // Don't bounce
- else
- done=true;
- // Movement ended; stop or die?
- if(done)
- {
- if((wpn->Misc[__EWI_MOVEMENT_ARG_2]&EWMF_DIE)!=0)
- {
- wpn->Z=0;
- KillEWeapon(wpn);
- }
- else
- {
- wpn->Misc[__EWI_MOVEMENT]=0;
- wpn->Step=0;
- }
- }
- }
- }
- void __UpdateEWMFall(eweapon wpn)
- {
- wpn->Jump=0; // Override engine handling of Z movement
- wpn->Misc[__EWI_WORK_2]-=wpn->Misc[__EWI_WORK];
- if(!IsSideview())
- wpn->Z=wpn->Misc[__EWI_WORK_2];
- else{
- wpn->HitYOffset= wpn->Misc[__EWI_WORK_2];
- wpn->DrawYOffset=wpn->Misc[__EWI_WORK_2];
- }
- wpn->Misc[__EWI_WORK]=Min(wpn->Misc[__EWI_WORK]+GH_GRAVITY, GH_TERMINAL_VELOCITY);
- // Hit the ground?
- if(wpn->Misc[__EWI_WORK_2]<=0
- && !OnSidePlatform(wpn->X, wpn->Y,
- wpn->HitXOffset,
- wpn->HitYOffset,
- wpn->HitHeight)){
- bool done=false;
- // Bounce
- if((wpn->Misc[__EWI_MOVEMENT_ARG_2]&EWMF_BOUNCE)!=0)
- {
- // Falling fast enough?
- if(wpn->Misc[__EWI_WORK]<-0.5) // Jump<=-0.5
- {
- wpn->Misc[__EWI_WORK]*=-0.5;
- wpn->Step*=0.75;
- }
- // Not fast enough
- else
- done=true;
- }
- // Don't bounce
- else
- done=true;
- // Movement ended; stop or die?
- if(done)
- {
- if((wpn->Misc[__EWI_MOVEMENT_ARG_2]&EWMF_DIE)!=0)
- {
- wpn->Z=0;
- KillEWeapon(wpn);
- }
- else
- {
- wpn->Misc[__EWI_MOVEMENT]=0;
- wpn->Step=0;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement