hschumann2/TempleOS-Source-Code
0847
1 2#define THRUST 1003 4Bool blast_off;5CMass m1, //Bottom of rocket6 m2; //Top of rocket7CSpring s;8 9#define ROCKET_HEIGHT 4010#define GROUND_Y (GR_HEIGHT-3*FONT_HEIGHT)11 12 13 <1>/* Graphics Not Rendered in HTML */14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30/* Graphics Not Rendered in HTML */31 32CDC *dc2;33 34U0 DrawIt(CTask *task,CDC *dc)35{36 I64 i,x,y,cx=GR_WIDTH/2,cy=GROUND_Y;37 Bool engine_on;38 F64 nozzle_angle,theta=Arg(m2.x-m1.x,m2.y-m1.y);39 40 Sprite3(dc,0,GROUND_Y,0,<2>);41 42 if (Bt(kbd.down_bitmap,SC_CURSOR_UP)) {43 nozzle_angle=0;44 engine_on=TRUE;45 } else if (Bt(kbd.down_bitmap,SC_CURSOR_LEFT)) {46 nozzle_angle=pi/8;47 engine_on=TRUE;48 } else if (Bt(kbd.down_bitmap,SC_CURSOR_RIGHT)) {49 nozzle_angle=-pi/8;50 engine_on=TRUE;51 } else52 engine_on=FALSE;53 54 if (engine_on) {55 x=m1.x-10*Cos(theta+nozzle_angle);56 y=m1.y-10*Sin(theta+nozzle_angle);57 for (i=0;i<6;i++) {58 if ((i^winmgr.updates)&1)59 dc->color=YELLOW;60 else61 dc->color=RED;62 GrLine(dc,cx+(m1.x+i*Cos(theta-pi/2)),cy-(m1.y+i*Sin(theta-pi/2)),cx+x,cy-y);63 GrLine(dc,cx+(m1.x+i*Cos(theta+pi/2)),cy-(m1.y+i*Sin(theta+pi/2)),cx+x,cy-y);64 }65 66 for (i=0;i<10;i++) {67 switch (RandU16&3) {68 case 0: dc2->color=WHITE; break;69 case 1: dc2->color=LTGRAY; break;70 case 2: dc2->color=DKGRAY; break;71 case 3: dc2->color=BLACK; break;72 }73 GrPlot(dc2,cx+(x+RandU16%12-6),cy-(y+RandU16%12-6));74 }75 Snd(22);76 } else77 Snd;78 Sprite3ZB(dc,cx+(m1.x+m2.x)/2,cy-(m1.y+m2.y)/2,0,<1>,-theta);79}80 81U0 MyDerivative(CMathODE *,F64,COrder2D3 *,COrder2D3 *)82{83 Bool engine_on;84 F64 nozzle_angle,theta=Arg(m2.state->x-m1.state->x,m2.state->y-m1.state->y);85 86 if (Bt(kbd.down_bitmap,SC_CURSOR_UP)) {87 nozzle_angle=0;88 engine_on=TRUE;89 } else if (Bt(kbd.down_bitmap,SC_CURSOR_LEFT)) {90 nozzle_angle=pi/8;91 engine_on=TRUE;92 } else if (Bt(kbd.down_bitmap,SC_CURSOR_RIGHT)) {93 nozzle_angle=-pi/8;94 engine_on=TRUE;95 } else96 engine_on=FALSE;97 98 if (engine_on) {99 m1.DstateDt->DxDt+=THRUST*Cos(theta+nozzle_angle);100 m1.DstateDt->DyDt+=THRUST*Sin(theta+nozzle_angle);101 }102 if (blast_off) {103 m1.DstateDt->DyDt-=25; //Gravity104 m2.DstateDt->DyDt-=25;105 }106}107 108U0 Init()109{110 DocClear;111 "$BG,LTCYAN$$GREEN$Up, Left, Right$FG$%h*c",ToI64(GROUND_Y/FONT_HEIGHT),'\n';112 113 blast_off=FALSE;114 115 //We don't clear que links.116 MemSet(&m1.start,0,offset(CMass.end)-offset(CMass.start));117 m1.y=0;118 119 MemSet(&m2.start,0,offset(CMass.end)-offset(CMass.start));120 m2.y=ROCKET_HEIGHT;121 122 MemSet(&s.start,0,offset(CSpring.end)-offset(CSpring.start));123 s.end1=&m1;124 s.end2=&m2;125 s.rest_len=ROCKET_HEIGHT;126 s.const=10000;127 128 DCFill;129}130 131U0 TaskEndCB()132{133 DCFill;134 SndTaskEndCB;135}136 137U0 Rocket()138{139 CMathODE *ode=ODENew(0,1e-2,ODEF_HAS_MASSES);140 141 SettingsPush; //See SettingsPush142 Fs->text_attr=YELLOW<<4+BLUE;143 MenuPush(144 "File {"145 " Abort(,CH_SHIFT_ESC);"146 " Exit(,CH_ESC);"147 "}"148 "Play {"149 " Restart(,'\n');"150 " Up(,,SC_CURSOR_UP);"151 " UpLeft(,,SC_CURSOR_LEFT);"152 " UpRight(,,SC_CURSOR_RIGHT);"153 "}"154 );155 156 AutoComplete;157 WinBorder;158 WinMax;159 DocCursor;160 DocClear;161 dc2=DCAlias;162 Fs->task_end_cb=&TaskEndCB;163 164 ode->derive=&MyDerivative;165 ode->drag_v2=0.002;166 ode->drag_v3=0.00001;167 ode->acceleration_limit=5e3;168 169 Init;170 QueIns(&m1,ode->last_mass);171 QueIns(&m2,ode->last_mass);172 QueIns(&s,ode->last_spring);173 174 QueIns(ode,Fs->last_ode);175 176 Fs->draw_it=&DrawIt;177 178 try {179 GetKey;180 blast_off=TRUE;181 while (TRUE) {182 switch (GetChar(,FALSE)) {183 case '\n':184 Init;185 GetKey;186 blast_off=TRUE;187 break;188 case CH_ESC:189 case CH_SHIFT_ESC:190 goto rk_done;191 }192 }193rk_done:194 } catch195 PutExcept;196 QueRem(ode);197 ODEDel(ode);198 DocClear;199 SettingsPop;200 DCFill;201 DCDel(dc2);202 MenuPop;203}204 205Rocket;206 