Control.asm 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673
  1. include_macros equ 1
  2. include_deb_mac equ 1
  3. include_flags equ 1
  4. include_struc equ 1
  5. include_error_codes equ 1
  6. include include.asm
  7. c2_cancel_pressed equ 100 ;save cancel key pressed
  8. c2_name_2_short equ 101 ;game name too short
  9. c2_game_saved equ 102
  10. c2_shifted equ 103
  11. c2_toggled equ 104
  12. c2_restarted equ 105
  13. c2_game_restored equ 106
  14. c2_restore_failed equ 107
  15. c2_no_disk_space equ 108
  16. c2_speed_changed equ 109
  17. yes_mask equ 0
  18. no_mask equ 1
  19. max_save_games equ 999 ;no of games in total
  20. max_text_len equ 80 ;max no of characters (multiple of 4 please)
  21. pan_line_width equ 184 ;width of save game line (pixels)
  22. pan_char_height equ 12 ;character set height
  23. mpnl_x equ 60
  24. mpnl_y equ 10
  25. spnl_x equ 20
  26. spnl_y equ 20
  27. ; save panel dimensions
  28. sp_height equ 149
  29. sp_top_gap equ 12
  30. sp_bot_gap equ 27
  31. game_name_x equ (spnl_x+18) ;x coordinate of game names
  32. game_name_y equ (spnl_y+sp_top_gap) ;start y coord of game names
  33. max_on_screen equ ((sp_height-sp_top_gap-sp_bot_gap)/pan_char_height) ;no of save games on screen
  34. cp_panel equ 60400 ;main panel sprite
  35. c_spr struc ;structure of a button
  36. sp_add dd ? ;pointer to pointer to sprite
  37. no_spr dd ? ;no of sprites in file
  38. c_spr dd ? ;current sprite
  39. x dd ? ;x address
  40. y dd ? ;y address
  41. text dd ? ;text to display
  42. routine dd ? ;routine to call if button pressed
  43. c_spr ends
  44. m_draw_sprite macro number
  45. ; draw sprite esi with frame number
  46. mov (c_spr ptr[esi]).c_spr,number
  47. push esi
  48. clear ebp
  49. call c2_draw_control_sprite2
  50. pop esi
  51. endm
  52. start32data
  53. extrn text_buffer:byte ;data for text mouse pointer
  54. ifdef cmd_options
  55. extrn _ignore_saved_game_version:dword
  56. endif
  57. ; Main panel variables
  58. c2_palette_data dd ? ;pointer to panel palette
  59. ; sprites to load at start
  60. no_init_sprites equ 10
  61. init_sprite_file equ 60500
  62. spp_control_panel dd ? ;pointer to control panel sprite
  63. spp_button dd ? ;pointer to panel button
  64. spp_dn_btn dd ? ;pointer to save panel down button
  65. spp_save_panel dd ? ;pointer to save restore panel sprite
  66. spp_yes_no dd ? ;pointer to yes/no sprite
  67. spp_slide dd ? ;pointer to slider sprite
  68. spp_slode dd ? ;pointer to slider sprite (hd)
  69. spp_slod2 dd ? ;pointer to slider sprite (cd)
  70. spp_slid2 dd ? ;pointer to slider sprite (cd)
  71. spp_music_bdg dd ? ;sprite to put over music symbol on cd version
  72. sp_control_panel c_spr <offset spp_control_panel,1,0,mpnl_x,mpnl_y,0,0> ;the main control panel
  73. sp_exit_btn c_spr <offset spp_button,3,0,mpnl_x+16,mpnl_y+125,7000h+50,offset r_exit> ;the exit button
  74. sp_slide c_spr <offset spp_slide,1,0,mpnl_x+19,mpnl_y+68,7000h+95,offset c2_slide> ;the speed slider
  75. sp_slid2 c_spr <offset spp_slid2,1,0,mpnl_x+19,mpnl_y+50+6,7000h+14,offset c2_slide2> ;the music vol slider
  76. sp_slode c_spr <offset spp_slode,1,0,mpnl_x+9 ,mpnl_y+49,0,0>
  77. sp_rest_pan_btn c_spr <offset spp_button,3,0,mpnl_x+58,mpnl_y+19,7000h+51,offset c2_rest_game_panel> ;the restore button
  78. sp_save_pan_btn c_spr <offset spp_button,3,0,mpnl_x+58,mpnl_y+39,7000h+48,offset c2_save_game_panel> ;the save button
  79. sp_dos_pan_btn c_spr <offset spp_button,3,0,mpnl_x+58,mpnl_y+59,7000h+93,offset c2_quit_to_dos> ;the quit button
  80. sp_restart_pan_btn c_spr <offset spp_button,3,0,mpnl_x+58,mpnl_y+79,7000h+94,offset c2_restart> ;the restart button
  81. sp_fx_pan_btn c_spr <offset spp_button,3,2,mpnl_x+58,mpnl_y+99,7000h+90,offset toggle_fx> ;the fx button
  82. sp_ms_pan_btn c_spr <offset spp_button,3,2,mpnl_x+58,mpnl_y+119,7000h+91,offset toggle_ms> ;the music button
  83. sp_bodge c_spr <offset spp_music_bdg,2,0,mpnl_x+98,mpnl_y+115,0,0> ;the music bodge
  84. sp_yes_no c_spr <offset spp_yes_no,1,0,mpnl_x-2,mpnl_y+40,0,0> ;yes / no panel
  85. sp_ctext c_spr <offset spp_ctext,1,0,mpnl_x+15,mpnl_y+137,0,0> ;Some text
  86. spp_ctext dd 0
  87. ; list of sprites to check for mouse over / mouse click, main panel
  88. cp_look_list_no equ 8
  89. cp_look_list dd offset sp_exit_btn
  90. dd offset sp_rest_pan_btn
  91. dd offset sp_save_pan_btn
  92. dd offset sp_dos_pan_btn
  93. dd offset sp_restart_pan_btn
  94. dd offset sp_fx_pan_btn
  95. dd offset sp_ms_pan_btn
  96. dd offset sp_slide
  97. dd offset sp_slid2
  98. ; save game variables
  99. sp_save_panel c_spr <offset spp_save_panel,1,0,spnl_x,spnl_y,0,0> ;the save panel sprite
  100. sp_look_list_no equ 6 ;buttons to check
  101. sp_look_list dd offset sp_save_btn ;\ save panel
  102. rp_look_list dd offset sp_dn_btn ;| \ restore panel
  103. dd offset sp_dn_btn2 ;| |
  104. dd offset sp_up_btn ;| |
  105. dd offset sp_up_btn2 ;| |
  106. dd offset sp_quit_btn ;/ :
  107. dd offset sp_rest_btn ; /
  108. sp_save_btn c_spr <offset spp_button,3,0,spnl_x+29,spnl_y+129,7000h+48,c2_save_a_game> ;save a real game
  109. sp_dn_btn c_spr <offset spp_dn_btn,1,0,spnl_x+212,spnl_y+104,0,c2_shift_down_fast> ;shift games down
  110. sp_dn_btn2 c_spr <offset spp_dn_btn,1,0,spnl_x+212,spnl_y+114,0,c2_shift_down_slow> ;shift games down
  111. sp_up_btn c_spr <offset spp_dn_btn,1,0,spnl_x+212,spnl_y+21,0,c2_shift_up_fast> ;shift games up
  112. sp_up_btn2 c_spr <offset spp_dn_btn,1,0,spnl_x+212,spnl_y+10,0,c2_shift_up_slow> ;shift games up
  113. sp_quit_btn c_spr <offset spp_button,3,0,spnl_x+72,spnl_y+129,7000h+49,offset c2_sp_cancel>
  114. sp_rest_btn c_spr <offset spp_button,3,0,spnl_x+29,spnl_y+129,7000h+51,c2_restore_a_game> ;restore a real game
  115. init_text dd 0
  116. restore_fx_flag dd ? ;set this if we want to restart fx when we leave the panel
  117. character_list db " ,().='-& +!?" ;list of valid characters
  118. db '"',0
  119. align 4
  120. ; Slider variables
  121. panel_int dd 0 ;set this when panel first run
  122. sl_sp_top_y dd (mpnl_y + 52) ;speed slider top y
  123. sl_sp_bot_y dd (mpnl_y + 92) ;speed slider bottom y
  124. sl_sp_range dd (mpnl_y + 92)-(mpnl_y + 52)
  125. sl_sp_devidor dd 4 ;step size
  126. sl_ms_top_y dd (mpnl_y + 49) ;volume slider top y
  127. sl_ms_bot_y dd (mpnl_y + 81) ;volume slider bottom y
  128. sl_ms_range dd (mpnl_y + 81)-(mpnl_y + 49)
  129. music_volume dd 27 ;31 ;music volume multiplier
  130. end32data
  131. start32save_data
  132. saved_char_set dd ?
  133. save_mouse_type dd 0
  134. save_m_off_x dd 0
  135. save_m_off_y dd 0
  136. end32save_data
  137. start32code
  138. control_panel proc
  139. ifdef s1_demo
  140. ret
  141. endif
  142. test [panel_int],-1 ;only do this once
  143. jne not_sb
  144. ; Change some things for the cd/sblaster version
  145. bt [system_flags],sf_sblaster ;sblaster only
  146. jnc not_sb
  147. mov (c_spr ptr[sp_slode]).sp_add,offset spp_slod2
  148. mov (c_spr ptr[sp_slide]).sp_add,offset spp_slid2
  149. mov (c_spr ptr[sp_slide]).y,(mpnl_y + 99)
  150. mov [sl_sp_top_y],(mpnl_y + 95) ;speed slider top y
  151. mov [sl_sp_bot_y],(mpnl_y + 105) ;speed slider bottom y
  152. mov [sl_sp_range],(mpnl_y + 105)-(mpnl_y + 95)
  153. mov [sl_sp_devidor],1
  154. test [_cd_version],-1
  155. je not_cd
  156. mov (c_spr ptr[sp_ms_pan_btn]).c_spr,0
  157. mov (c_spr ptr[sp_ms_pan_btn]).text,35+7000h
  158. mov (c_spr ptr[sp_bodge]).c_spr,1
  159. not_cd: mov [panel_int],1
  160. not_sb: call set_up_control_panel_data
  161. ; Now print out the main control panel
  162. new_control_panel: call flush_key_buffer
  163. call remove_mouse
  164. call clear_screen
  165. mov esi,offset sp_control_panel
  166. mov ebp,no_mask
  167. call c2_draw_control_sprite2
  168. mov esi,offset sp_exit_btn
  169. mov ebp,no_mask
  170. call c2_draw_control_sprite2
  171. mov esi,offset sp_save_pan_btn
  172. mov ebp,no_mask
  173. call c2_draw_control_sprite2
  174. mov esi,offset sp_rest_pan_btn
  175. mov ebp,no_mask
  176. call c2_draw_control_sprite2
  177. mov esi,offset sp_dos_pan_btn
  178. mov ebp,no_mask
  179. call c2_draw_control_sprite2
  180. mov esi,offset sp_restart_pan_btn
  181. mov ebp,no_mask
  182. call c2_draw_control_sprite2
  183. mov esi,offset sp_fx_pan_btn
  184. mov ebp,no_mask
  185. call c2_draw_control_sprite2
  186. mov esi,offset sp_ms_pan_btn
  187. mov ebp,no_mask
  188. call c2_draw_control_sprite2
  189. mov esi,offset sp_slode
  190. mov ebp,yes_mask
  191. printf "1"
  192. call c2_draw_control_sprite2
  193. mov esi,offset sp_slide
  194. mov ebp,yes_mask
  195. printf "2"
  196. call c2_draw_control_sprite2
  197. mov esi,offset sp_bodge
  198. mov ebp,yes_mask
  199. printf "3"
  200. call c2_draw_control_sprite2
  201. printf "4"
  202. bt [system_flags],sf_sblaster ;sblaster only
  203. jnc not_cd2
  204. mov esi,offset sp_slid2
  205. mov ebp,yes_mask
  206. call c2_draw_control_sprite2
  207. not_cd2: mov eax,[init_text]
  208. jife eax,no_init_text
  209. call control_text
  210. mov [init_text],0
  211. no_init_text: btr [mouse_flag],mf_no_update
  212. call fn_normal_mouse
  213. ; Loop round looking for something to do
  214. control_loop: mov esi,offset cp_look_list
  215. mov ecx,cp_look_list_no
  216. ;test [_cd_version],-1 ;xtra slide in cd + sblaster combination
  217. ;je look_loop
  218. bt [system_flags],sf_sblaster
  219. jnc look_loop
  220. inc ecx
  221. look_loop: push esi
  222. mov esi,[esi]
  223. call c2_check_for_hit
  224. pop esi
  225. je btn_hit
  226. lea esi,4[esi]
  227. loop look_loop
  228. ; No buttons
  229. call c2_restore_button_screen ;restore screen under button text
  230. mov [bmouse_b],0
  231. control_key: call fetch_key
  232. je control_loop
  233. cmp ax,27
  234. je r_exit2
  235. cmp ax,13
  236. je r_exit2
  237. jmp control_loop
  238. btn_hit: ;The mouse is over a button, we must print up some text
  239. mov esi,[esi]
  240. call c2_button_control
  241. test [mouse_b],-1
  242. je control_key
  243. call c2_kill_button
  244. call (c_spr ptr[esi]).routine
  245. ; Check return value
  246. cmp eax,c2_cancel_pressed
  247. je new_control_panel
  248. cmp eax,c2_toggled
  249. je control_loop
  250. cmp eax,c2_speed_changed
  251. je control_loop
  252. cmp eax,c2_game_saved
  253. je r_exit2
  254. cmp eax,c2_game_restored
  255. je r_exit2
  256. cmp eax,c2_restarted
  257. je r_exit2
  258. jmp new_control_panel
  259. ; End control panel
  260. r_exit:: pop eax ;trash return address
  261. m_draw_sprite 2 ;press button
  262. mov (c_spr ptr[esi]).c_spr,0
  263. r_exit2: call disinstall_control_panel
  264. ; Check if we must restart any sound fx
  265. test [restore_fx_flag],-1
  266. je no_rst_fx
  267. call restore_saved_effects_0 ;restore any constant sound fx
  268. no_rst_fx: ret
  269. control_panel endp
  270. toggle_fx_kbd proc
  271. ; Called from keyboard so no control data has been set up
  272. mov esi,offset sp_fx_pan_btn
  273. xor (c_spr ptr[esi]).c_spr,2
  274. btc [system_flags],sf_fx_off
  275. jc was_off
  276. clear eax
  277. call fn_suspend_fx
  278. mov eax,1
  279. call fn_suspend_fx
  280. ret
  281. was_off: call restore_saved_effects_0 ;restore any constant sound fx
  282. call restore_saved_effects_1 ;restore any constant sound fx
  283. ret
  284. toggle_fx_kbd endp
  285. toggle_fx proc
  286. push esi
  287. call remove_mouse
  288. pop esi
  289. xor (c_spr ptr[esi]).c_spr,2
  290. mov ebp,no_mask
  291. call c2_draw_control_sprite2
  292. btc [system_flags],sf_fx_off
  293. jc was_off
  294. ; Turn fx off
  295. clear eax
  296. call fn_suspend_fx
  297. mov eax,1
  298. call fn_suspend_fx
  299. mov [restore_fx_flag],0 ;don't restart them when we leave
  300. mov eax,7000h+87 ;text for fx off
  301. jmp was_on
  302. was_off: mov [restore_fx_flag],1 ;restart fx when we leave
  303. mov eax,7000h+86 ;text for fx on
  304. was_on: call control_text
  305. call restore_mouse
  306. call wait_mouse_not_pressed
  307. mov eax,c2_toggled
  308. ret
  309. toggle_fx endp
  310. toggle_ms_kbd proc
  311. ; Called from keyboard so no control data has been set up
  312. mov esi,offset sp_ms_pan_btn
  313. xor (c_spr ptr[esi]).c_spr,2
  314. btc [system_flags],sf_mus_off
  315. jc was_off
  316. call stop_music
  317. ret
  318. was_off: call restart_current_music
  319. ret
  320. toggle_ms_kbd endp
  321. toggle_ms proc
  322. test [_cd_version],-1
  323. je not_cd
  324. ; flip between text, speech and text&speech
  325. ; 35 21 52
  326. ifndef american_cd
  327. cmp (c_spr ptr[esi]).text,35+7000h
  328. je was_text_only
  329. endif
  330. cmp (c_spr ptr[esi]).text,21+7000h
  331. je was_speech_only
  332. ; text only to text and speech to speech only
  333. bts [system_flags],sf_allow_speech
  334. mov eax,21+7000h
  335. jmp cgot
  336. was_text_only: ;speech only to text only to speech and text
  337. bts [system_flags],sf_allow_text
  338. btr [system_flags],sf_allow_speech
  339. mov eax,52+7000h
  340. jmp cgot
  341. was_speech_only: ;text and speech to speech only to text only
  342. btr [system_flags],sf_allow_text
  343. mov eax,35+7000h
  344. cgot: xchg (c_spr ptr[esi]).text,eax
  345. push esi
  346. call control_text
  347. pop esi
  348. call c2_depress_button_2 ;wait until mouse released
  349. mov eax,c2_toggled
  350. ret
  351. cdun: mov (c_spr ptr[esi]).text,eax
  352. not_cd: push esi
  353. call remove_mouse
  354. btc [system_flags],sf_mus_off
  355. jc was_off
  356. call stop_music
  357. mov eax,7000h+89
  358. jmp was_on
  359. was_off: call restart_current_music
  360. mov eax,7000h+88
  361. was_on: call control_text
  362. pop esi
  363. xor (c_spr ptr[esi]).c_spr,2
  364. mov ebp,no_mask
  365. call c2_draw_control_sprite2
  366. call restore_mouse
  367. call wait_mouse_not_pressed
  368. mov eax,c2_toggled
  369. ret
  370. toggle_ms endp
  371. control_text proc
  372. ; Draw up some text on the screen
  373. ; Do text eax
  374. push eax
  375. mov eax,[spp_ctext]
  376. jife eax,no_free
  377. call my_free
  378. no_free: pop eax
  379. ; Now do the text
  380. call get_text
  381. mov dl,-1
  382. mov ecx,140
  383. clear ebx
  384. mov esi,offset text_buffer
  385. mov ebp,1
  386. call display_text
  387. mov [spp_ctext],eax
  388. push es
  389. mov es,[screen_segment]
  390. mov edi,163*320 + 66
  391. lea esi,SIZE s[eax]
  392. movzx ebx,(s ptr[eax]).s_width
  393. movzx edx,(s ptr[eax]).s_height
  394. add esi,ebx
  395. sub edx,2
  396. ct_ylop: mov ecx,ebx
  397. push edi
  398. ct_xlop: lodsb
  399. jifne al,not0
  400. mov al,34
  401. not0: stosb
  402. floop ecx,ct_xlop
  403. pop edi
  404. lea edi,320[edi]
  405. floop edx,ct_ylop
  406. pop es
  407. ret
  408. control_text endp
  409. set_up_control_panel_data proc
  410. ; First save the current mouse status
  411. call fn_pause_fx
  412. mov eax,[mouse_type2]
  413. mov [save_mouse_type],eax
  414. mov eax,[mouse_offset_x]
  415. mov [save_m_off_x],eax
  416. mov eax,[mouse_offset_y]
  417. mov [save_m_off_y],eax
  418. call fn_disk_mouse
  419. mov eax,60510 ;load in the palette
  420. clear edx
  421. call load_file
  422. mov [c2_palette_data],eax
  423. mov eax,[cur_char_set] ;save current character set
  424. mov [saved_char_set],eax
  425. ; load in the character set
  426. mov eax,2
  427. call fn_set_font
  428. ; Load in the essential sprites
  429. mov eax,init_sprite_file
  430. mov ecx,no_init_sprites
  431. mov edi,offset spp_control_panel
  432. init_load_loop: push eax
  433. push ecx
  434. push edi
  435. clear edx
  436. call load_file
  437. pop edi
  438. stosd
  439. pop ecx
  440. pop eax
  441. inc eax
  442. loop init_load_loop
  443. call remove_mouse
  444. call clear_screen
  445. mov esi,[c2_palette_data]
  446. call set_palette
  447. ; Set up some memory locations
  448. mov eax,max_save_games*max_text_len
  449. call my_malloc
  450. mov [c2_save_game_texts],eax
  451. ret
  452. set_up_control_panel_data endp
  453. disinstall_control_panel proc
  454. ; free up the memory we used
  455. call remove_mouse
  456. r_exit2: mov eax,[c2_palette_data]
  457. call my_free
  458. ifdef mem_check
  459. mov [c2_palette_data],0
  460. endif
  461. mov esi,offset spp_control_panel ;free panel sprites
  462. mov ecx,no_init_sprites
  463. free_loop1: lodsd
  464. ifdef mem_check
  465. mov dpt[esi-4],0
  466. endif
  467. push esi
  468. push ecx
  469. call my_free
  470. pop ecx
  471. pop esi
  472. loop free_loop1
  473. mov eax,[c2_save_game_texts]
  474. call my_free
  475. ifdef mem_check
  476. mov [c2_save_game_texts],0 ;for checking it was freed]
  477. endif
  478. mov esi,offset c2_text_sprites ;free saved game sprites
  479. mov ecx,max_on_screen
  480. free_loop91: clear eax
  481. xchg eax,[esi]
  482. jife eax,no_91
  483. push esi
  484. push ecx
  485. call my_free
  486. pop ecx
  487. pop esi
  488. lea esi,4[esi]
  489. no_91: loop free_loop91
  490. mov eax,[c2_edit_sprite]
  491. jife eax,no_espr
  492. call my_free
  493. mov [c2_edit_sprite],0
  494. no_espr: call fn_force_refresh
  495. mov [bmouse_b],0
  496. mov eax,[saved_char_set]
  497. call fn_set_font
  498. call wait_mouse_not_pressed
  499. call clear_screen
  500. mov eax,[current_palette]
  501. call fn_set_palette
  502. call restore_mouse
  503. ; restore mouse data
  504. mov eax,[save_mouse_type]
  505. mov ebx,[save_m_off_x]
  506. mov [mouse_offset_x],ebx
  507. mov ecx,[save_m_off_y]
  508. mov [mouse_offset_y],ecx
  509. ; If mouse type == 0 we have an object fing
  510. jife eax,obj_mouse
  511. call sprite_mouse
  512. jmp mouse_done
  513. obj_mouse: call fn_close_hand
  514. mouse_done:
  515. call flush_key_buffer
  516. call fn_un_pause_fx
  517. ret
  518. disinstall_control_panel endp
  519. restore_a_game_from_disk proc
  520. ; edx points to name of file to load
  521. push edx
  522. call _open_for_read__Npc
  523. or eax,eax
  524. js no_restore
  525. ; mov ax,3d00h ;open the file
  526. ; clear ecx
  527. ; dos_int
  528. ; jc no_restore
  529. ; cause an error if versions changed
  530. push eax
  531. clear eax
  532. call fn_stop_fx
  533. mov eax,1
  534. call fn_stop_fx
  535. call fn_flush_buffers
  536. pop ebx
  537. mov edx,offset start_of_save_data ;read the data length
  538. mov ecx,4
  539. mov ah,3fh
  540. int 21h
  541. jc restore_error
  542. mov edx,offset start_of_save_data + 4 ;read the data
  543. mov ecx,[start_of_save_data]
  544. mov eax,offset end_of_save_data ;check sizes are the same
  545. sub eax,offset start_of_save_data
  546. cmp eax,ecx
  547. je gamok
  548. program_error em_invalid_save
  549. gamok: sub ecx,4
  550. mov ah,3fh
  551. int 21h
  552. jc restore_error
  553. ; Now read the saved games replay data
  554. ifdef with_replay
  555. bt [system_flags],sf_replay_rst
  556. jc no_rep_lod
  557. mov edx,offset start_of_save_data ;read the data length
  558. mov ecx,4
  559. mov ah,3fh
  560. int 21h
  561. jc restore_error
  562. mov eax,[start_of_save_data]
  563. mov [replay_data_len],eax
  564. mov [replay_data_ptr],eax
  565. push ebx
  566. add eax,40 ;play safe
  567. call my_malloc
  568. pop ebx
  569. mov [replay_data],eax
  570. mov edx,eax
  571. mov ecx,[start_of_save_data]
  572. mov ah,3fh
  573. int 21h
  574. no_rep_lod:
  575. endif
  576. mov ah,3eh ;and close the file
  577. int 21h
  578. ifdef with_replay
  579. bt [system_flags],sf_replay_rst
  580. jc no_rep_lod2
  581. call rewrite_replay_file ;new replay file
  582. no_rep_lod2:
  583. endif
  584. call load_grids ;reload fresh grids
  585. call restore_file_lists
  586. call fn_text_kill2
  587. ifndef s1_demo
  588. mov eax,[current_section]
  589. call fn_leave_section
  590. endif
  591. mov eax,[save_current_section]
  592. call fn_enter_section
  593. mov eax,[saved_current_music]
  594. call fn_start_music
  595. call restore_saved_effects_0 ;restore any constant sound fx
  596. call restore_saved_effects_1 ;restore any constant sound fx
  597. mov eax,c2_game_restored
  598. bts [system_flags],sf_game_restored
  599. ret
  600. no_restore: mov eax,c2_restore_failed
  601. ret
  602. restore_error: program_error em_disk_rd_error
  603. restore_a_game_from_disk endp
  604. force_restart proc
  605. bts [system_flags],sf_replay_rst
  606. call fn_fade_down
  607. mov edx,[restart_name_p]
  608. call restore_a_game_from_disk
  609. call fn_force_refresh
  610. call re_create
  611. call sprite_engine
  612. call flip
  613. clear eax ;ensure module 0 and 1 in
  614. call check_module_loaded
  615. mov eax,1
  616. call check_module_loaded
  617. mov eax,[current_palette]
  618. call fn_fade_up
  619. bts [system_flags],sf_game_restored
  620. btr [system_flags],sf_replay_rst
  621. ret
  622. force_restart endp
  623. fn_restore_game proc
  624. ifdef s1_demo
  625. ret
  626. endif
  627. call set_up_control_panel_data
  628. call fn_normal_mouse
  629. clear esi ;no button to push
  630. call c2_rest_game_panel
  631. call disinstall_control_panel
  632. clear eax
  633. ret
  634. fn_restore_game endp
  635. fn_restart_game proc
  636. call force_restart
  637. clear eax
  638. ret
  639. fn_restart_game endp
  640. end32code
  641. ;--------------------------------------------------------------------------------------------------
  642. ;--------------------------------------------------------------------------------------------------
  643. start32data
  644. c2_save_game_texts dd ? ;Pointer to game numbers and text stored here
  645. c2_text_sprites dd max_on_screen dup (0) ;pointers to the text sprites
  646. c2_text_c_spr c_spr <0,1,0,game_name_x,0> ;c_spr for displaying texts
  647. c2_desc_file dd ? ;file handle of description files
  648. c2_desc_temp dd ? ;temporary store for loading description file
  649. c2_desc_size dd ? ;size of desc file
  650. c2_cur_button dd ? ;mouse is over this button
  651. c2_cur_but_textn dd 0 ;text for current button
  652. c2_cur_but_text_sp dd 0 ;pointer to button text sprite
  653. c2_button_screen c_spr <offset c2_cur_but_text_sp,1,0,0,0>
  654. c2_button_save_dat dd ?
  655. c2_button_save_adr dd ?
  656. c2_button_save_wid dd ?
  657. c2_button_save_hig dd ?
  658. c2_game_on_top dd 0 ;game number on top of list
  659. c2_edit_game dd 0 ;no of game selected
  660. c2_edit_text db max_text_len dup (?) ;text being edited
  661. c2_edit_cursor dd ? ;location of cursor
  662. c2_edit_sprite dd 0 ;pointer to text being edited
  663. c2_edit_width dd ? ;width of line in editor buffer (pixels)
  664. c2_allow_edit dd ? ;set if we can edit text
  665. end32data
  666. start32code
  667. c2_load_save_descriptions proc
  668. ; Set up blank numbers for the save game texts
  669. mov ecx,max_save_games
  670. mov ebx,312020h ;convoluted game counter
  671. mov eax,[c2_save_game_texts]
  672. aloc_loop: mov [eax],ebx ;put game number in, followed by
  673. mov dpt 3[eax],203ah ; ': '
  674. ; Increment counter
  675. add ebx,10000h ;units
  676. cmp ebx,3a0000h
  677. jc count_inced
  678. and ebx,0ffffh
  679. cmp bh,' ' ;tens
  680. jne not_ten_sp
  681. mov bh,'0'
  682. not_ten_sp: add ebx,300100h
  683. cmp bh,'9'+1
  684. jc count_inced
  685. cmp bl,' ' ;hundreds
  686. jne not_ton_sp
  687. mov bl,'0'
  688. not_ton_sp: mov bh,'0'
  689. inc bl
  690. count_inced: add eax,max_text_len
  691. loop aloc_loop
  692. ; Load in the file containing the file descriptions
  693. push [save_game_text_file]
  694. call _open_for_read__Npc
  695. or eax,eax
  696. js no_file
  697. ; mov ax,3d00h
  698. ; mov edx,[save_game_text_file3]
  699. ; int 21h
  700. ; jc no_file
  701. ; The file exists so load it all in
  702. mov [c2_desc_file],eax ;save file handle
  703. clear edx ;get file size
  704. clear ecx
  705. mov ebx,eax
  706. mov ax,4202h
  707. dos_int
  708. shl edx,16 ;allocate memory
  709. movzx eax,ax
  710. or eax,edx
  711. mov [c2_desc_size],eax
  712. call my_malloc
  713. mov [c2_desc_temp],eax
  714. mov ax,4200h ;return file to beginning
  715. mov ebx,[c2_desc_file]
  716. clear ecx
  717. clear edx
  718. dos_int
  719. mov ah,3fh ;read in the data
  720. mov ecx,[c2_desc_size]
  721. mov edx,[c2_desc_temp]
  722. dos_int
  723. mov ah,3eh ;and close the file
  724. dos_int
  725. ; Convert the data into a more useable form
  726. mov esi,[c2_desc_temp]
  727. lodsd ;check the versions are ok
  728. ifdef cmd_options
  729. test [_ignore_saved_game_version],-1 ;command line flag
  730. jne sg_ver_ok
  731. endif
  732. cmp eax,dpt[replay_version]
  733. jne invalid_save_data
  734. sg_ver_ok: mov edi,[c2_save_game_texts]
  735. lea edi,5[edi] ;skip numbers
  736. mov ecx,max_save_games
  737. tran_loop2: push edi
  738. tran_loop: lodsb
  739. stosb
  740. jifne al,tran_loop
  741. pop edi
  742. lea edi,max_text_len[edi]
  743. loop tran_loop2
  744. ; Savegame details present and correct, Sah!
  745. invalid_save_data: mov eax,[c2_desc_temp]
  746. call my_free
  747. no_file: ret
  748. c2_load_save_descriptions endp
  749. c2_button_control proc
  750. ; Mouse is over button esi, handle any text that is needed
  751. push esi
  752. mov [c2_cur_button],esi
  753. mov eax,(c_spr ptr[esi]).text ;get button text
  754. jife eax,no_new_stuff ;are we going to print any?
  755. cmp eax,[c2_cur_but_textn] ;is it same as last lot
  756. je just_move
  757. no_new_stuff: test [c2_cur_but_textn],-1 ;have we old stuff that needs removing
  758. je no_old_stuff
  759. push esi
  760. call c2_restore_button_screen ;restore screen under button text
  761. mov eax,[c2_cur_but_text_sp]
  762. call my_free
  763. mov [c2_cur_but_text_sp],0
  764. pop esi
  765. no_old_stuff: mov eax,(c_spr ptr[esi]).text ;get button text
  766. mov [c2_cur_but_textn],eax
  767. jife eax,no_button_text
  768. call get_text
  769. mov dl,-1
  770. mov ecx,pan_line_width
  771. clear ebx
  772. mov esi,offset text_buffer
  773. clear ebp ;no centering
  774. call display_text
  775. mov [c2_cur_but_text_sp],eax
  776. jmp draw_first_button
  777. just_move: ;see if the button wants moving
  778. mov eax,[amouse_x]
  779. add eax,12
  780. cmp eax,[c2_button_screen.x]
  781. jne yes_move
  782. mov eax,[amouse_y]
  783. sub eax,16
  784. cmp eax,[c2_button_screen.y]
  785. je no_move
  786. yes_move: call c2_restore_button_screen
  787. draw_first_button: mov eax,[amouse_x]
  788. add eax,12
  789. mov [c2_button_screen.x],eax
  790. mov eax,[amouse_y]
  791. sub eax,16
  792. mov [c2_button_screen.y],eax
  793. call c2_save_button_screen
  794. mov esi,offset c2_button_screen
  795. mov ebp,yes_mask
  796. call c2_draw_control_sprite2
  797. no_move:
  798. no_button_text: pop esi
  799. ret
  800. c2_button_control endp
  801. c2_kill_button proc
  802. ; Text for a button has been finished with
  803. push esi
  804. mov eax,[c2_cur_but_text_sp]
  805. jife eax,no_bspr
  806. call my_free
  807. mov [c2_cur_but_text_sp],0
  808. no_bspr: mov [c2_cur_but_textn],0
  809. call c2_restore_button_screen ;restore screen under button text
  810. pop esi
  811. ret
  812. c2_kill_button endp
  813. c2_save_button_screen proc
  814. ; Save the screen data under the button text
  815. call remove_mouse
  816. mov esi,offset c2_button_screen ;set up save sprite
  817. mov ebx,(c_spr ptr[esi]).sp_add
  818. mov ebx,[ebx]
  819. mov eax,(c_spr ptr[esi]).y
  820. imul eax,320
  821. add eax,(c_spr ptr[esi]).x
  822. mov [c2_button_save_adr],eax
  823. movzx eax,(s ptr[ebx]).s_width
  824. mov [c2_button_save_wid],eax
  825. movzx ecx,(s ptr[ebx]).s_height
  826. mov [c2_button_save_hig],ecx
  827. imul eax,ecx
  828. call my_malloc
  829. mov [c2_button_save_dat],eax
  830. ; Save the data
  831. mov edi,eax
  832. mov esi,[c2_button_save_adr]
  833. mov ebx,[c2_button_save_wid]
  834. mov edx,[c2_button_save_hig]
  835. push ds
  836. mov ds,[screen_segment]
  837. save_loop_y: push esi
  838. mov ecx,ebx
  839. rep movsb
  840. pop esi
  841. lea esi,320[esi]
  842. floop edx,save_loop_y
  843. pop ds
  844. call restore_mouse
  845. ret
  846. c2_save_button_screen endp
  847. c2_restore_button_screen proc
  848. ; Restore the data under the button text
  849. test [c2_button_save_dat],-1
  850. je nowt_2_rest
  851. push esi
  852. call remove_mouse
  853. mov es,[screen_segment]
  854. mov esi,[c2_button_save_dat]
  855. mov edi,[c2_button_save_adr]
  856. mov ebx,[c2_button_save_wid]
  857. mov edx,[c2_button_save_hig]
  858. rb_loop: push edi
  859. mov ecx,ebx
  860. rep movsb
  861. pop edi
  862. lea edi,320[edi]
  863. floop edx,rb_loop
  864. push ds
  865. pop es
  866. call restore_mouse
  867. mov eax,[c2_button_save_dat]
  868. call my_free
  869. mov [c2_button_save_dat],0
  870. pop esi
  871. nowt_2_rest: ret
  872. c2_restore_button_screen endp
  873. c2_check_for_hit proc
  874. ; check if the mouse is over a sprite
  875. ; Return z=1 for hit, z=0 for no hit
  876. ; esi points to sprite structure
  877. push ecx
  878. mov edi,(c_spr ptr[esi]).sp_add ;get pointer to sprite data
  879. mov edi,[edi]
  880. mov eax,(c_spr ptr[esi]).x ;check x
  881. cmp [amouse_x],eax
  882. jc no_hit
  883. add ax,(s ptr[edi]).s_width
  884. cmp eax,[amouse_x]
  885. jc no_hit
  886. mov eax,(c_spr ptr[esi]).y ;check y
  887. cmp [amouse_y],eax
  888. jc no_hit
  889. add ax,(s ptr[edi]).s_height
  890. cmp eax,[amouse_y]
  891. jc no_hit
  892. ; we have a hit
  893. clear eax
  894. pop ecx
  895. ret
  896. no_hit: or al,1
  897. pop ecx
  898. ret
  899. c2_check_for_hit endp
  900. c2_draw_control_sprite2 proc
  901. ; Draw a control sprite to the screen
  902. ; esi points to the sprite information
  903. ; ebp = 0 Mask sprite over current screen
  904. ; ebp = 1 Overwrite screen contents
  905. push es
  906. mov es,[screen_segment]
  907. mov edi,(c_spr ptr[esi]).y ;calculate screen position
  908. imul edi,full_screen_width
  909. add edi,(c_spr ptr[esi]).x
  910. mov eax,(c_spr ptr[esi]).c_spr ;get current sprite number
  911. mov esi,(c_spr ptr[esi]).sp_add ;get pointer to sprite data
  912. mov esi,[esi]
  913. movzx ebx,(s ptr[esi]).s_width ;get sprite dimensions
  914. movzx edx,(s ptr[esi]).s_height
  915. movzx ecx,(s ptr[esi]).s_sp_size ;now point to appropriate sprite
  916. imul eax,ecx
  917. lea esi,SIZE s[esi]
  918. add esi,eax
  919. jifne ebp,stamp_on_it
  920. draw_loop: push edi
  921. mov ecx,ebx
  922. pix_lop: lodsb
  923. jife al,no_pix
  924. mov es:[edi],al
  925. no_pix: inc edi
  926. loop pix_lop
  927. pop edi
  928. add edi,full_screen_width
  929. floop edx,draw_loop
  930. pop es
  931. ret ;done
  932. stamp_on_it: push edi
  933. mov ecx,ebx
  934. rep movsb
  935. pop edi
  936. add edi,full_screen_width
  937. floop edx,stamp_on_it
  938. pop es
  939. ret ;done
  940. c2_draw_control_sprite2 endp
  941. c2_depress_button_2 proc
  942. ; depress button sprite esi until mouse button released
  943. m_draw_sprite 2
  944. call wait_mouse_not_pressed
  945. m_draw_sprite 0
  946. ret
  947. c2_depress_button_2 endp
  948. c2_save_game_panel proc
  949. ; Switch to the save game screen
  950. ; called from main panel loop
  951. mov [c2_allow_edit],1 ;allow texts to be edited
  952. call c2_save_restore_panel
  953. cmp eax,c2_no_disk_space
  954. jne got_room
  955. mov [init_text],7000h + 54
  956. got_room: ret
  957. c2_save_game_panel endp
  958. c2_rest_game_panel proc
  959. mov [c2_allow_edit],0 ;texts can't be edited
  960. call c2_save_restore_panel
  961. ret
  962. c2_rest_game_panel endp
  963. c2_save_restore_panel proc
  964. jife esi,no_pbut
  965. call c2_depress_button_2 ;wait until mouse released
  966. no_pbut: call remove_mouse
  967. mov esi,offset sp_save_panel ;print the sprites
  968. mov ebp,no_mask
  969. call c2_draw_control_sprite2
  970. mov esi,offset sp_quit_btn
  971. mov ebp,no_mask
  972. call c2_draw_control_sprite2
  973. call c2_load_save_descriptions ;load in the save descriptions
  974. call c2_init_edit_game
  975. call c2_set_edit_sprite
  976. call c2_set_up_game_sprites ;set up the game text sprites
  977. call c2_display_game_sprites ;and display them
  978. ; Hang around for a key press or a mouse press
  979. rest_fail: mov esi,offset sp_save_btn
  980. mov ebp,no_mask
  981. call c2_draw_control_sprite2
  982. call restore_mouse
  983. wait_loop: mov esi,offset sp_look_list ;check for some buttons
  984. test [c2_allow_edit],-1
  985. jne is_save
  986. mov esi,offset rp_look_list ;check for some buttons
  987. is_save: mov ecx,sp_look_list_no
  988. look_loop: push esi
  989. mov esi,[esi]
  990. call c2_check_for_hit
  991. pop esi
  992. je btn_hit
  993. lea esi,4[esi]
  994. loop look_loop
  995. call c2_restore_button_screen ;restore screen under button text
  996. ; Check for a change of game
  997. test [mouse_b],-1
  998. je no_new_game
  999. mov eax,[amouse_x]
  1000. cmp eax,game_name_x
  1001. jc no_new_game
  1002. cmp eax,game_name_x+pan_line_width
  1003. jnc no_new_game
  1004. mov eax,[amouse_y]
  1005. cmp eax,game_name_y
  1006. jc no_new_game
  1007. cmp eax,game_name_y + max_on_screen * pan_char_height
  1008. jnc no_new_game
  1009. ; We have a new game
  1010. sub eax,game_name_y
  1011. mov ebx,pan_char_height
  1012. clear edx
  1013. idiv ebx
  1014. add eax,[c2_game_on_top]
  1015. ; eax is new game
  1016. cmp eax,[c2_edit_game]
  1017. je check_keys
  1018. mov [c2_edit_game],eax
  1019. call c2_init_edit_game
  1020. call c2_set_edit_sprite
  1021. call remove_mouse
  1022. call c2_display_game_sprites ;and display them
  1023. call restore_mouse
  1024. no_new_game: jmp check_keys
  1025. btn_hit: ;A button has been hit
  1026. mov esi,[esi]
  1027. call c2_button_control
  1028. test [mouse_b],-1
  1029. je check_keys
  1030. call c2_kill_button
  1031. ; A button has been pressed, go to it
  1032. call (c_spr ptr[esi]).routine
  1033. ; Check the return values
  1034. cmp eax,c2_cancel_pressed
  1035. je sp_cancel
  1036. cmp eax,c2_game_saved
  1037. je sp_cancel
  1038. cmp eax,c2_game_restored
  1039. je sp_cancel
  1040. cmp eax,c2_restore_failed
  1041. je rest_fail
  1042. cmp eax,c2_no_disk_space
  1043. je sp_cancel
  1044. jmp wait_loop
  1045. sp_cancel: ret
  1046. check_keys: ;Check for a key press
  1047. call fetch_key
  1048. je wait_loop
  1049. cmp ax,13
  1050. je save_by_key_press
  1051. cmp ax,27
  1052. je c2_sp_cancel
  1053. test [c2_allow_edit],-1 ;in restore game edit not allowed
  1054. je wait_loop
  1055. cmp ax,8 ;delete?
  1056. je backspace
  1057. ; Is char 0-9, a-z or A-Z
  1058. cmp ax,'0' ;check for 0-9
  1059. jc check_list
  1060. cmp ax,'9'+1
  1061. jc is_char
  1062. cmp ax,'A' ;check for A-Z
  1063. jc check_list
  1064. cmp ax,'Z'+1
  1065. jc is_char
  1066. cmp ax,'a' ;check for a-z
  1067. jc check_list
  1068. cmp ax,'z'+1
  1069. jc is_char
  1070. check_list: ;Check through a list to see if this character is allowed
  1071. mov esi,offset character_list
  1072. chk_ch_lop: test bpt[esi],-1
  1073. je wait_loop
  1074. cmp al,[esi]
  1075. je is_char
  1076. inc esi
  1077. jmp chk_ch_lop
  1078. is_char: ;We have a character. Is there room for it
  1079. cmp [c2_edit_width],pan_line_width-6
  1080. jnc wait_loop
  1081. cmp [c2_edit_cursor],max_text_len
  1082. jnc wait_loop
  1083. mov ebx,[c2_edit_cursor] ;put the character in
  1084. mov esi,offset c2_edit_text
  1085. mov ds:[esi+ebx],al
  1086. mov wpt ds:[esi+ebx+1],5fh ;and terminate it
  1087. inc [c2_edit_cursor]
  1088. redraw_text: call c2_set_edit_sprite
  1089. call remove_mouse
  1090. call c2_display_game_sprites ;and display them
  1091. call restore_mouse
  1092. jmp wait_loop
  1093. backspace: ;delete a character
  1094. cmp [c2_edit_cursor],6
  1095. jc wait_loop
  1096. dec [c2_edit_cursor]
  1097. mov esi,offset c2_edit_text
  1098. mov eax,[c2_edit_cursor]
  1099. mov wpt [esi+eax],5fh
  1100. jmp redraw_text
  1101. save_by_key_press: call c2_kill_button
  1102. test [c2_allow_edit],-1
  1103. je rest_by_key_press
  1104. call c2_save_a_game
  1105. cmp eax,c2_name_2_short
  1106. je wait_loop
  1107. ret
  1108. rest_by_key_press: call c2_restore_a_game
  1109. cmp eax,c2_restore_failed
  1110. je rest_fail
  1111. ret
  1112. ;try_and_save: call save_game
  1113. ; jc wait_loop
  1114. ; stc
  1115. ; ret
  1116. ;
  1117. ; call c2_restore_button_screen ;restore screen under button text
  1118. ;
  1119. ; test [bmouse_b],-1 ;only do something with save games if a button is pressed
  1120. ; je check_key
  1121. ; mov [bmouse_b],0
  1122. ;
  1123. ; mov esi,[display_c_spr] ;check if we have clicked on a new game
  1124. ; mov ecx,max_on_screen
  1125. ;chk_gam_lop: push esi
  1126. ; push ecx
  1127. ; call check_for_hit
  1128. ; pop ecx
  1129. ; pop esi
  1130. ; je new_game
  1131. ; add esi,SIZE c_spr
  1132. ; loop chk_gam_lop
  1133. ;
  1134. ;check_key: call fetch_key ;get a key
  1135. ; je wait_loop
  1136. ;
  1137. ;
  1138. ;
  1139. ; mov esi,[esi]
  1140. ;ifdef new_control
  1141. ; call c2_button_control
  1142. ; test [mouse_b],-1
  1143. ; je wait_loop
  1144. ; call c2_kill_button
  1145. ;else
  1146. ; call button_control
  1147. ; jne wait_loop
  1148. ;endif
  1149. ;
  1150. ;; a button has been pressed, go to it my lads
  1151. ;
  1152. ; call (c_spr ptr[esi]).routine
  1153. ; jc wait_loop
  1154. ; stc
  1155. ; ret
  1156. ;
  1157. ;
  1158. ;new_game: ;user has selected a line on the screen
  1159. ;
  1160. ; mov eax,max_on_screen ;calculate which one
  1161. ; sub eax,ecx
  1162. ; add eax,[start_game]
  1163. ;
  1164. ; cmp eax,[edit_game_no] ;check we haven't reselected the current sprite
  1165. ; je wait_loop
  1166. ;
  1167. ; push eax ;save game no
  1168. ; call remove_mouse ;stop the mouse awhile
  1169. ;
  1170. ; pop esi
  1171. ; xchg esi,[edit_game_no] ;restore original text data
  1172. ; sub esi,[start_game]
  1173. ; imul esi,SIZE c_spr
  1174. ; add esi,[display_c_spr]
  1175. ; mov ebp,1
  1176. ; call c2_draw_control_sprite
  1177. ;
  1178. ; jmp edit_game_text
  1179. ;
  1180. ;
  1181. ;finish_save:
  1182. ;; mov esi,[display_spr]
  1183. ;; mov ecx,max_on_screen
  1184. ;;ds_fr_lop: lodsd
  1185. ;; push esi
  1186. ;; push ecx
  1187. ;; call my_free
  1188. ;; pop ecx
  1189. ;; pop esi
  1190. ;; loop ds_fr_lop
  1191. ;
  1192. ; stc ;force new control panel
  1193. ; ret
  1194. ;
  1195. ;
  1196. ;; The text has been done, save the game
  1197. ;
  1198. ;shift_down_1:: ;move the display list down
  1199. ;
  1200. ; test [bmouse_b],-1 ;only one at a time
  1201. ; je no_shift
  1202. ;
  1203. ;shift_down_fast:: mov [bmouse_b],0
  1204. ; mov eax,[start_game] ;check we can scroll down
  1205. ; cmp eax,max_save_games-max_on_screen-1
  1206. ; jnc no_shift
  1207. ;
  1208. ; inc [start_game]
  1209. ;
  1210. ; mov esi,[display_spr] ;free the first one and shift the others up
  1211. ; push esi
  1212. ; lodsd
  1213. ; push esi
  1214. ; call my_free
  1215. ; pop esi
  1216. ; pop edi
  1217. ; mov ecx,max_on_screen-1
  1218. ; rep movsd
  1219. ; push edi
  1220. ;
  1221. ; mov esi,[start_game] ;fetch new game
  1222. ; add esi,max_on_screen-1
  1223. ; imul esi,max_text_len
  1224. ; add esi,[c2_save_game_texts]
  1225. ; mov dl,-1
  1226. ; mov ecx,pan_line_width
  1227. ; clear ebx
  1228. ; clear ebp ;no centering
  1229. ; call display_text
  1230. ; pop edi
  1231. ; stosd
  1232. ;
  1233. ; sub (c_spr ptr[sp_save_text]).y,pan_char_height
  1234. ;
  1235. ;; now redraw the sprites, including highlit one
  1236. ;
  1237. ; call remove_mouse
  1238. ;
  1239. ; mov esi,[display_c_spr]
  1240. ; mov ecx,max_on_screen
  1241. ; mov eax,[start_game]
  1242. ;
  1243. ;redraw_loop: push ecx
  1244. ; push esi
  1245. ; push eax
  1246. ;
  1247. ; cmp eax,[edit_game_no] ;check for highlit game
  1248. ; jne norma
  1249. ;
  1250. ; mov esi,offset sp_save_text
  1251. ;
  1252. ;norma: mov ebp,1
  1253. ; call c2_draw_control_sprite
  1254. ;
  1255. ; pop eax
  1256. ; inc eax
  1257. ; pop esi
  1258. ; lea esi,SIZE c_spr[esi]
  1259. ; pop ecx
  1260. ; loop redraw_loop
  1261. ;
  1262. ;; check if current game has been shifted off the top
  1263. ;
  1264. ; mov eax,[start_game]
  1265. ; cmp eax,[edit_game_no]
  1266. ; jbe no_ngam
  1267. ;
  1268. ; mov [edit_game_no],eax
  1269. ; call [highlight_current_game]
  1270. ;
  1271. ;no_ngam: call restore_mouse
  1272. ;
  1273. ;no_shift: stc
  1274. ; ret
  1275. ;
  1276. ;
  1277. ;shift_up_1:: ;move the display list up
  1278. ;
  1279. ; test [bmouse_b],-1 ;only one at a time
  1280. ; je no_shift
  1281. ;
  1282. ;shift_up_fast:: mov [bmouse_b],0
  1283. ; test [start_game],-1 ;check we can scroll up
  1284. ; je no_shift
  1285. ;
  1286. ; dec [start_game]
  1287. ;
  1288. ; mov esi,[display_spr] ;free the first one and shift the others up
  1289. ; add esi,(max_on_screen-1)*4
  1290. ; push esi
  1291. ; mov eax,[esi]
  1292. ; call my_free
  1293. ; pop edi
  1294. ; mov esi,edi
  1295. ; lea esi,[edi-4]
  1296. ; mov ecx,max_on_screen-1
  1297. ; std
  1298. ; rep movsd
  1299. ; cld
  1300. ; push edi
  1301. ;
  1302. ; mov esi,[start_game] ;fetch new game
  1303. ; imul esi,max_text_len
  1304. ; add esi,[c2_save_game_texts]
  1305. ; mov dl,-1
  1306. ; mov ecx,pan_line_width
  1307. ; clear ebx
  1308. ; clear ebp ;no centering
  1309. ; call display_text
  1310. ; pop edi
  1311. ; mov [edi],eax
  1312. ;
  1313. ; add (c_spr ptr[sp_save_text]).y,pan_char_height
  1314. ;
  1315. ;; now redraw the sprites, including highlit one
  1316. ;
  1317. ; call remove_mouse
  1318. ;
  1319. ; mov esi,[display_c_spr]
  1320. ; mov ecx,max_on_screen
  1321. ; mov eax,[start_game]
  1322. ;
  1323. ;redraw_loop2: push ecx
  1324. ; push esi
  1325. ; push eax
  1326. ;
  1327. ; cmp eax,[edit_game_no] ;check for highlit game
  1328. ; jne norma2
  1329. ;
  1330. ; mov esi,offset sp_save_text
  1331. ;
  1332. ;norma2: mov ebp,1
  1333. ; call c2_draw_control_sprite
  1334. ;
  1335. ; pop eax
  1336. ; inc eax
  1337. ; pop esi
  1338. ; lea esi,SIZE c_spr[esi]
  1339. ; pop ecx
  1340. ; loop redraw_loop2
  1341. ;
  1342. ;; check if current game has been shifted off the bottom
  1343. ;
  1344. ; mov eax,[start_game]
  1345. ; add eax,max_on_screen-1
  1346. ; cmp eax,[edit_game_no]
  1347. ; jnc no_ngam2
  1348. ;
  1349. ; mov [edit_game_no],eax
  1350. ; call [highlight_current_game]
  1351. ;
  1352. ;no_ngam2: call restore_mouse
  1353. ; stc
  1354. ; ret
  1355. c2_save_restore_panel endp
  1356. c2_set_up_game_sprites proc
  1357. ; Set up the sprites for save/restore games
  1358. mov esi,[c2_game_on_top]
  1359. imul esi,max_text_len
  1360. add esi,[c2_save_game_texts] ;point to the first one
  1361. mov edi,offset c2_text_sprites ;store addresses here
  1362. mov ecx,max_on_screen
  1363. sups_lop: push esi
  1364. push edi
  1365. push ecx
  1366. mov dl,37
  1367. mov cx,pan_line_width
  1368. mov ebx,[edi] ;use old data if there is any
  1369. clear ebp ;no centering
  1370. call display_text
  1371. pop ecx
  1372. pop edi
  1373. pop esi
  1374. stosd
  1375. lea esi,max_text_len[esi]
  1376. loop sups_lop
  1377. ret
  1378. c2_set_up_game_sprites endp
  1379. c2_display_game_sprites proc
  1380. ; Display the game texts
  1381. mov esi,offset c2_text_sprites
  1382. mov ebx,game_name_y
  1383. mov ecx,max_on_screen
  1384. mov edx,[c2_game_on_top]
  1385. dgs_loop: push esi
  1386. push ebx
  1387. push ecx
  1388. push edx
  1389. cmp edx,[c2_edit_game]
  1390. jne not_edit
  1391. mov esi,offset c2_edit_sprite
  1392. not_edit: mov (c_spr ptr[c2_text_c_spr]).sp_add,esi
  1393. mov (c_spr ptr[c2_text_c_spr]).y,ebx
  1394. mov esi,offset c2_text_c_spr
  1395. mov ebp,no_mask
  1396. call c2_draw_control_sprite2
  1397. pop edx
  1398. pop ecx
  1399. pop ebx
  1400. pop esi
  1401. add ebx,pan_char_height
  1402. inc edx
  1403. lea esi,4[esi]
  1404. loop dgs_loop
  1405. ret
  1406. c2_display_game_sprites endp
  1407. c2_sp_cancel proc
  1408. ; Save / restore cancel pressed
  1409. call c2_kill_button
  1410. mov eax,c2_cancel_pressed
  1411. ret
  1412. c2_sp_cancel endp
  1413. c2_save_game_to_disk proc
  1414. ; save game to file, edx points to name
  1415. mov eax,[current_music]
  1416. mov [saved_current_music],eax
  1417. push edx
  1418. call _open_for_write__Npc
  1419. or eax,eax
  1420. js save_error
  1421. ; mov ah,3ch ;create a new file
  1422. ; clear ecx
  1423. ; dos_int
  1424. ; jc save_error
  1425. mov edx,offset start_of_save_data ;write the savedata data
  1426. mov ecx,offset end_of_save_data
  1427. sub ecx,edx
  1428. mov [start_of_save_data],ecx
  1429. mov ebx,eax
  1430. mov ah,40h
  1431. dos_int
  1432. jc save_error
  1433. ; Save the replay data for this file
  1434. ifdef with_replay
  1435. mov edx,offset replay_data_ptr ;first write data length
  1436. mov ecx,4
  1437. mov ah,40h
  1438. int 21h
  1439. mov edx,[replay_data] ;then data
  1440. mov ecx,[replay_data_ptr]
  1441. mov ah,40h
  1442. int 21h
  1443. endif
  1444. mov ah,3eh ;and close the file
  1445. dos_int
  1446. ret
  1447. save_error: program_error em_disk_rd_error
  1448. c2_save_game_to_disk endp
  1449. c2_save_a_game proc
  1450. ; Save the game
  1451. cmp [c2_edit_cursor],6 ;only save if some text has gone in
  1452. jnc ok_2_save
  1453. mov eax,c2_name_2_short
  1454. ret
  1455. ok_2_save: call remove_mouse
  1456. mov ah,19h ;get default drive
  1457. int 21h
  1458. test [_cd_version],-1
  1459. je not_cd99
  1460. mov al,2
  1461. not_cd99: mov ah,36h ;get free disk space
  1462. mov dl,al
  1463. inc dl
  1464. int 21h
  1465. cmp ax,-1 ;no drive?
  1466. je insuff_disk_space
  1467. movzx eax,ax
  1468. movzx ebx,bx
  1469. movzx ecx,cx
  1470. imul eax,ebx
  1471. imul eax,ecx
  1472. mov ebx,offset end_of_save_data
  1473. sub ebx,offset start_of_save_data
  1474. add ebx,10000
  1475. cmp eax,ebx
  1476. jc insuff_disk_space
  1477. mov esi,offset sp_save_btn ;depress the button
  1478. m_draw_sprite 2
  1479. mov (c_spr ptr[esi]).c_spr,0
  1480. mov esi,offset c2_edit_text ;transfer the name over
  1481. mov eax,[c2_edit_cursor] ;trash '_'
  1482. mov bpt[esi+eax],0
  1483. mov edi,[c2_edit_game] ;put data into the slot
  1484. imul edi,max_text_len
  1485. add edi,[c2_save_game_texts]
  1486. mov ecx,max_text_len/4
  1487. rep movsd
  1488. ; Save the saved game texts
  1489. push [save_game_text_file]
  1490. call _open_for_write__Npc
  1491. or eax,eax
  1492. js save_error
  1493. ; mov ah,3ch
  1494. ; clear ecx
  1495. ; mov edx,[save_game_text_file3]
  1496. ; dos_int
  1497. ; jc save_error
  1498. mov ebx,eax
  1499. mov ah,40h ;write version no
  1500. mov ecx,4
  1501. mov edx,offset replay_version
  1502. dos_int
  1503. ; Shuffle the data down, removing the gaps
  1504. mov ecx,max_save_games ;write out all text descriptions
  1505. mov esi,[c2_save_game_texts]
  1506. mov edi,esi
  1507. shuffle_text: push esi
  1508. lea esi,5[esi] ;skip game number
  1509. char_loop: lodsb
  1510. stosb
  1511. jifne al,char_loop
  1512. pop esi ;next line
  1513. lea esi,max_text_len[esi]
  1514. loop shuffle_text
  1515. mov ah,40h ;write out text data
  1516. mov ecx,edi
  1517. mov edx,[c2_save_game_texts]
  1518. sub ecx,edx
  1519. dos_int
  1520. mov ah,3eh ;and close the file
  1521. int 21h
  1522. ; Save the game data
  1523. mov eax,[c2_edit_game]
  1524. inc eax
  1525. mov bx,10
  1526. clear edx
  1527. idiv bx ;my kingdom for a srintf
  1528. add dl,'0'
  1529. mov esi,[save_game_name]
  1530. mov [esi+11],dl
  1531. clear edx
  1532. idiv bx
  1533. add dl,'0'
  1534. mov [esi+10],dl
  1535. clear edx
  1536. idiv bx
  1537. add dl,'0'
  1538. mov [esi+9],dl
  1539. ifdef with_replay
  1540. mov eax,-1
  1541. clear ebx
  1542. clear ecx
  1543. call replay_record_event ;flag game save
  1544. endif
  1545. mov edx,[save_game_name]
  1546. call c2_save_game_to_disk
  1547. call restore_mouse
  1548. mov eax,c2_game_saved
  1549. ret
  1550. insuff_disk_space: mov eax,c2_no_disk_space
  1551. ret
  1552. save_error: program_error em_disk_rd_error
  1553. c2_save_a_game endp
  1554. c2_init_edit_game proc
  1555. mov esi,[c2_edit_game]
  1556. imul esi,max_text_len
  1557. add esi,[c2_save_game_texts]
  1558. mov edi,offset c2_edit_text
  1559. tran_gm: lodsb
  1560. jife al,trand_gm
  1561. stosb
  1562. jmp tran_gm
  1563. trand_gm: test [c2_allow_edit],-1
  1564. je no_edit
  1565. mov ax,'_'
  1566. no_edit: stosw
  1567. sub edi,offset c2_edit_text+2
  1568. mov [c2_edit_cursor],edi
  1569. ret
  1570. c2_init_edit_game endp
  1571. c2_set_edit_sprite proc
  1572. mov dl,-1
  1573. mov cx,pan_line_width
  1574. mov ebx,[c2_edit_sprite]
  1575. clear ebp ;no centering
  1576. mov esi,offset c2_edit_text
  1577. call display_text
  1578. mov [c2_edit_sprite],eax
  1579. mov [c2_edit_width],ebx
  1580. ret
  1581. c2_set_edit_sprite endp
  1582. c2_shift_down_fast proc
  1583. ; Shift the games down one
  1584. mov eax,[c2_game_on_top] ;can we do it?
  1585. cmp eax,max_save_games - max_on_screen
  1586. jnc no_shift
  1587. inc [c2_game_on_top]
  1588. mov esi,offset c2_text_sprites
  1589. mov edi,esi
  1590. lodsd ;this one goes off top
  1591. mov ecx,max_on_screen-1
  1592. rep movsd
  1593. push edi
  1594. ; mov ebx,eax ;move one in from bottom
  1595. call my_free
  1596. clear ebx
  1597. mov esi,[c2_game_on_top]
  1598. add esi,max_on_screen-1
  1599. imul esi,max_text_len
  1600. add esi,[c2_save_game_texts]
  1601. mov dl,37
  1602. mov cx,pan_line_width
  1603. clear ebp ;no centering
  1604. call display_text
  1605. pop edi
  1606. stosd
  1607. mov eax,[c2_edit_game] ;check for selected game scrolling off top
  1608. cmp eax,[c2_game_on_top]
  1609. jnc no_scrofftop
  1610. mov eax,[c2_game_on_top]
  1611. mov [c2_edit_game],eax
  1612. call c2_init_edit_game
  1613. call c2_set_edit_sprite
  1614. no_scrofftop: call c2_display_game_sprites
  1615. no_shift: mov eax,c2_shifted
  1616. ret
  1617. c2_shift_down_fast endp
  1618. c2_shift_down_slow proc
  1619. call c2_shift_down_fast
  1620. call wait_mouse_not_pressed
  1621. mov eax,c2_shifted
  1622. ret
  1623. c2_shift_down_slow endp
  1624. c2_shift_up_fast proc
  1625. ; Shift the games down one
  1626. test [c2_game_on_top],-1 ;can we do it?
  1627. je no_shift
  1628. dec [c2_game_on_top]
  1629. mov esi,offset c2_text_sprites + ( (max_on_screen-1) * 4)
  1630. mov edi,esi
  1631. std
  1632. lodsd ;this one goes off top
  1633. mov ecx,max_on_screen-1
  1634. rep movsd
  1635. cld
  1636. push edi
  1637. mov ebx,eax ;move one in from bottom
  1638. mov esi,[c2_game_on_top]
  1639. imul esi,max_text_len
  1640. add esi,[c2_save_game_texts]
  1641. mov dl,37
  1642. mov cx,pan_line_width
  1643. clear ebp ;no centering
  1644. call display_text
  1645. pop edi
  1646. stosd
  1647. mov eax,[c2_game_on_top]
  1648. add eax,max_on_screen-1
  1649. cmp eax,[c2_edit_game]
  1650. jnc no_scrofftop
  1651. mov eax,[c2_game_on_top]
  1652. add eax,max_on_screen-1
  1653. mov [c2_edit_game],eax
  1654. call c2_init_edit_game
  1655. call c2_set_edit_sprite
  1656. no_scrofftop: call c2_display_game_sprites
  1657. no_shift: mov eax,c2_shifted
  1658. ret
  1659. c2_shift_up_fast endp
  1660. c2_shift_up_slow proc
  1661. call c2_shift_up_fast
  1662. call wait_mouse_not_pressed
  1663. mov eax,c2_shifted
  1664. ret
  1665. c2_shift_up_slow endp
  1666. c2_restore_a_game proc
  1667. ; Restore the game data
  1668. call remove_mouse
  1669. mov esi,offset sp_rest_btn
  1670. m_draw_sprite 2
  1671. mov eax,[c2_edit_game]
  1672. inc eax
  1673. mov bx,10
  1674. clear edx
  1675. idiv bx ;my kingdom for a srintf
  1676. add dl,'0'
  1677. mov esi,[save_game_name]
  1678. mov [esi+11],dl
  1679. clear edx
  1680. idiv bx
  1681. add dl,'0'
  1682. mov [esi+10],dl
  1683. clear edx
  1684. idiv bx
  1685. add dl,'0'
  1686. mov [esi+9],dl
  1687. mov edx,[save_game_name]
  1688. call restore_a_game_from_disk
  1689. push eax
  1690. call wait_mouse_not_pressed
  1691. mov esi,offset sp_rest_btn
  1692. m_draw_sprite 2
  1693. pop eax
  1694. ret
  1695. restore_error: program_error em_disk_rd_error
  1696. c2_restore_a_game endp
  1697. c2_get_yes_no proc
  1698. ; Print the yes / no sprite and get a response
  1699. call remove_mouse
  1700. mov esi,offset sp_yes_no
  1701. mov ebp,yes_mask
  1702. call c2_draw_control_sprite2
  1703. call restore_mouse
  1704. call wait_mouse_not_pressed
  1705. clear edx ;set edx for when mouse is normal
  1706. not_but: jifne edx,check_loop
  1707. call fn_normal_mouse
  1708. inc edx
  1709. check_loop: cmp [amouse_y],83 ;check y
  1710. jc not_but
  1711. cmp [amouse_y],110
  1712. jnc not_but
  1713. cmp [amouse_x],77 ;now x
  1714. jc not_but
  1715. cmp [amouse_x],114
  1716. jc on_yes
  1717. cmp [amouse_x],156 ;now x
  1718. jc not_but
  1719. cmp [amouse_x],193
  1720. jnc not_but
  1721. ; Over the no
  1722. jife edx,is_cross1
  1723. call do_cross_mouse
  1724. clear edx
  1725. is_cross1: test [mouse_b],-1
  1726. je check_loop
  1727. ret ;return with z = 0
  1728. on_yes: ;over the yes
  1729. jife edx,is_cross2
  1730. call do_cross_mouse
  1731. clear edx
  1732. is_cross2: test [mouse_b],-1
  1733. je check_loop
  1734. clear eax
  1735. ret ;return with z = 1
  1736. c2_get_yes_no endp
  1737. c2_quit_to_dos proc
  1738. ; Quit to dos, maybe
  1739. call c2_get_yes_no
  1740. jne not_really
  1741. program_error em_game_over
  1742. not_really: ret
  1743. c2_quit_to_dos endp
  1744. c2_restart proc
  1745. ; Restart, maybe
  1746. call c2_get_yes_no
  1747. mov eax,0
  1748. jne not_really
  1749. ;call force_restart
  1750. call fn_disk_mouse
  1751. mov edx,[restart_name_p]
  1752. call restore_a_game_from_disk
  1753. call remove_mouse
  1754. mov eax,c2_restarted
  1755. not_really: ret
  1756. c2_restart endp
  1757. c2_slide proc
  1758. ; control the slider
  1759. max_speed equ 9
  1760. ;c2_top_y equ (mpnl_y + 52)
  1761. ;c2_bot_y equ (mpnl_y + 92)
  1762. call remove_mouse
  1763. slide_loop: mov eax,[amouse_y] ;calculate new speed
  1764. sub eax,2
  1765. jc yes_uflow
  1766. sub eax,[sl_sp_top_y]
  1767. jnc no_uflow
  1768. yes_uflow: clear eax
  1769. no_uflow: cmp eax,[sl_sp_range]
  1770. jc no_oflow
  1771. mov eax,[sl_sp_range]
  1772. no_oflow: mov ebx,[sl_sp_devidor] ;(c2_bot_y - c2_top_y + max_speed - 1) / max_speed
  1773. clear edx
  1774. idiv ebx
  1775. ; eax should be new number
  1776. jifne eax,speed_fudge
  1777. inc eax
  1778. speed_fudge:
  1779. cmp eax,[stabilise_count]
  1780. je same_count
  1781. mov [stabilise_count],eax
  1782. imul eax,[sl_sp_devidor] ;(c2_bot_y - c2_top_y + max_speed - 1) / max_speed
  1783. add eax,[sl_sp_top_y]
  1784. mov esi,offset sp_slide
  1785. mov (c_spr ptr[esi]).y,eax
  1786. push esi
  1787. mov esi,offset sp_slode
  1788. mov ebp,no_mask
  1789. call c2_draw_control_sprite2
  1790. ;test [_cd_version],-1
  1791. ;je not_cd
  1792. bt [system_flags],sf_sblaster ;sblaster only
  1793. jnc not_cd
  1794. mov esi,offset sp_slid2
  1795. mov ebp,yes_mask
  1796. call c2_draw_control_sprite2
  1797. not_cd: pop esi
  1798. mov ebp,yes_mask
  1799. call c2_draw_control_sprite2
  1800. same_count: call debug_loop
  1801. test [mouse_b],-1
  1802. jne slide_loop
  1803. call restore_mouse
  1804. inc [stabilise_count]
  1805. mov eax,c2_speed_changed
  1806. ret
  1807. c2_slide endp
  1808. c2_slide2 proc
  1809. ; control the slider
  1810. max_speed equ 9
  1811. ;c2_top_y equ (mpnl_y + 52)
  1812. ;c2_bot_y equ (mpnl_y + 92)
  1813. call remove_mouse
  1814. slide_loop: mov eax,[amouse_y] ;calculate new speed
  1815. sub eax,2
  1816. jc yes_uflow
  1817. sub eax,[sl_ms_top_y]
  1818. jnc no_uflow
  1819. yes_uflow: clear eax
  1820. no_uflow: cmp eax,[sl_ms_range]
  1821. jc no_oflow
  1822. mov eax,[sl_ms_range]
  1823. no_oflow: ;mov ebx,4 ;(c2_bot_y - c2_top_y + max_speed - 1) / max_speed
  1824. ;clear edx
  1825. ;idiv ebx
  1826. mov ebx,32
  1827. sub ebx,eax
  1828. ; ebx should be new number
  1829. cmp ebx,[music_volume]
  1830. je same_count
  1831. mov [music_volume],ebx
  1832. ;imul eax,4 ;(c2_bot_y - c2_top_y + max_speed - 1) / max_speed
  1833. add eax,[sl_ms_top_y]
  1834. mov esi,offset sp_slid2
  1835. mov (c_spr ptr[esi]).y,eax
  1836. push esi
  1837. mov esi,offset sp_slode
  1838. mov ebp,no_mask
  1839. call c2_draw_control_sprite2
  1840. mov esi,offset sp_slide
  1841. mov ebp,yes_mask
  1842. call c2_draw_control_sprite2
  1843. pop esi
  1844. mov ebp,yes_mask
  1845. call c2_draw_control_sprite2
  1846. mov ecx,[music_volume] ;0-32
  1847. shl ecx,3 ;0-256
  1848. mov ah,13
  1849. call music_command
  1850. same_count: call debug_loop
  1851. test [mouse_b],-1
  1852. jne slide_loop
  1853. call restore_mouse
  1854. mov eax,c2_speed_changed
  1855. ret
  1856. c2_slide2 endp
  1857. end32code
  1858. end
  1859.