; Game Logic Module ; --------------------------------------------------------------------------- INCDIR "c:/Users/capitano/Documents/giochino/" INCLUDE "custom.i" ; XDEF InitGameLogic ; XDEF UpdateGame ; XDEF GameState ; XDEF Stress ; XDEF Satisfaction ; XDEF GameTime ; XDEF EmailCount ; XREF ReadInput ; XREF LastKey ; XREF DrawText ; XREF ClearScreen ; XREF EmailList ; SECTION Code,CODE_C ; Constants STATE_TITLE EQU 0 STATE_PLAYING EQU 1 STATE_GAMEOVER EQU 2 START_TIME EQU 9*60 ; 9:00 AM in minutes END_TIME EQU 17*60 ; 5:00 PM in minutes MAX_STRESS EQU 100 START_SATIS EQU 50 InitGameLogic: move.b #STATE_TITLE,GameState rts StartGame: move.b #STATE_PLAYING,GameState move.b #0,Stress move.b #START_SATIS,Satisfaction move.w #START_TIME,GameTime move.w #0,EmailCount bsr ClearScreen bsr SpawnEmail rts SpawnEmail: ; For now, just pick the first email always, or cycle ; TODO: Randomize lea EmailList,a0 move.l a0,CurrentEmail bsr DrawEmail rts DrawEmail: move.l CurrentEmail,a0 cmp.l #0,a0 beq .done ; Draw Sender (at 2, 12) move.l 2(a0),a0 ; Get Sender Ptr moveq #2,d0 ; X moveq #12,d1 ; Y bsr DrawText ; Draw Subject (at 2, 14) move.l CurrentEmail,a0 move.l 6(a0),a0 ; Get Subject Ptr moveq #2,d0 moveq #14,d1 bsr DrawText ; Draw Body (at 2, 16) move.l CurrentEmail,a0 move.l 10(a0),a0 ; Get Body Ptr moveq #2,d0 moveq #16,d1 bsr DrawText ; Draw Options (at 2, 20 and 2, 22) move.l CurrentEmail,a0 move.l 14(a0),a0 ; Opt1 moveq #2,d0 moveq #20,d1 bsr DrawText move.l CurrentEmail,a0 move.l 18(a0),a0 ; Opt2 moveq #2,d0 moveq #22,d1 bsr DrawText .done: rts UpdateGame: move.b GameState,d0 cmp.b #STATE_TITLE,d0 beq UpdateTitle cmp.b #STATE_PLAYING,d0 beq UpdatePlaying cmp.b #STATE_GAMEOVER,d0 beq UpdateGameOver rts UpdateTitle: ; Check for Space or Return to start ; For now, auto-start bsr StartGame rts UpdatePlaying: ; 1. Check Win/Loss move.b Stress,d0 cmp.b #MAX_STRESS,d0 bge SetGameOver move.b Satisfaction,d0 beq SetGameOver move.w GameTime,d0 cmp.w #END_TIME,d0 bge SetGameOver ; 2. Check Input for Options move.b LastKey,d0 cmp.b #0,d0 beq .noInput ; Clear LastKey immediately to prevent re-processing move.b #0,LastKey ; Check '1' and '2' keys ; Amiga raw keycodes: '1' = $01, '2' = $02 cmp.b #$01,d0 ; '1' beq .opt1 cmp.b #$02,d0 ; '2' beq .opt2 bra .noInput .opt1: ; Apply effects ; TODO: Read effects from CurrentEmail bsr NextEmail bra .noInput .opt2: bsr NextEmail bra .noInput .noInput: ; 3. Update Time addq.w #1,FrameCounter cmp.w #250,FrameCounter blt.s .noTimeUpdate move.w #0,FrameCounter addq.w #1,GameTime .noTimeUpdate: rts NextEmail: ; Clear screen area (or full screen) bsr ClearScreen bsr SpawnEmail rts UpdateGameOver: ; Wait for restart rts SetGameOver: move.b #STATE_GAMEOVER,GameState rts ; SECTION Data,DATA_C GameState: dc.b 0 Stress: dc.b 0 Satisfaction: dc.b 0 ALIGN 2 GameTime: dc.w 0 EmailCount: dc.w 0 FrameCounter: dc.w 0 CurrentEmail: dc.l 0