;------------------
;Zcasino Source
;#define		WithTimer
;#define		WithHalt
#define		GreyScale

;___________________________________
;MacroDefining
#define	STextWrite	set	7,(iy+14h)
#define	RTextWrite	res	7,(iy+14h)
#define	STextInverse	set	3,(iy+05h)
#define	RTextInverse	res	3,(iy+05h)
#define	debug	ld	de,0000h	\	ld	(pencol),de	\	call	Vputshl

#include "ion.inc"
;
;;------------Start of program----------------------
;------Initialisation du programme
#ifdef TI83P
 .org    progstart-2
 .db     $BB,$6D
TempRam	=86ECh
#else
TempRam	=saferam2
 .org    progstart
#endif
 ret
 jr nc,start
 .db "Zcasino for ION",0

fastcopy =ionfastcopy
ifastcopy =ionfastcopy
ilsprite	=ionlargesprite
isprite	=ionPutSprite
irandom	=ionrandom
;--------------------------> User variable (Not Saved)
timer		=TempRam		; [1] Timer memory
animtimer	=TempRam+1		; [1] Timer for animation
PersoParle	=TempRam+2		; [2] MapAdd of for the action routine
option		=TempRam+4		; [1] Option for menu routine
persoadd	=TempRam+5		; [2] Add for the player
animadd_2anim	=TempRam+7		; [1] Offset for animation loop (slowing down
Mise		=TempRam+8		; [2] Mise Du joueur dans les jeu
Dee			=TempRam+10	; [4] espace de data pour les de
#ifdef GreyScale
Greycounter	=TempRam+14	; [1] Flag pour le grey scale
#endif
NbrOfCard	=TempRam+15	; [1] Nombre de carte dans les decks
DeckCard	=TempRam+200	; [54] Les carte du deck

Card1			=TempRam+10
Card2		=TempRam+11
Card3			=TempRam+12
BlackJackCard	=TempRam+100
PlayerSum		=TempRam+17
DealerSum		=TempRam+19
tmpaddr		=TempRam+255
lastcardposition	=TempRam+21
aceflag			=Tempram+150
acedealerflag		=tempram+151
SlotCounter1		=Tempram+100
slotcounter2		=Tempram+102
slotcounter3		=Tempram+104
slottemp			=tempram+106
;--------------------------> User variable (Saved when quit)
XYPosofPerso	=TempRam+30		; [2] Position of the player
mapadd		=TempRam+32		; [2] Add for the current map
WMap		=TempRam+34		; [2] Current Map Address
persodir	=TempRam+36		; [1] Direction of the player
persoanim	=TempRam+37		; [1] Current annimation for the player
cash		=TempRam+38		; [2] Cash for the current player
QuestFlag	=TempRam+40		; [1] Flag for quest????

;----------- USER DEFINITED VAR
NbrdeStock	= 	



start:
#ifdef TI83
	ei
#endif	
	ld	hl,$FFFF
	push	hl
 	ld 	hl,TempRam		; Reset all memory of apdbuffer
 	ld 	(hl),0
 	ld 	de,TempRam+1
 	ld 	bc,322			; The buffer is 323 
 	ldir
;----------------------------------------------------
;-------->Title screen(with about thing)
	ld	hl,plotsscreen		; \Turn all screen Black
	ld	(hl),11111111b		;  |
	ld	de,plotsscreen+1	;  |
	ld	bc,767			;  |
	ldir				; /
	
	ld	hl,TitleScreen		; \ Title Picture
	ld	de,plotsscreen		;  |
	ld	bc,288			;  |
	call	DecompressRLE		; /
	call	fastcopy
	res	textwrite,(iy+$14)        	; \About of the game
	set	textinverse,(iy+textflags)	;  |
	ld	hl,AboutStr			;  |
	ld	de,$2400			;  |
	call	setvputs			;  |	; routine de Mirage
	call	vnewline			;  |	; routine de Mirage
	bcall(_vputs)				;  |
	call	vnewline			;  |	; routine de Mirage
	bcall(_vputs)				;  |	

	call	D_I_Waitkey			;  |

;	res	textinverse,(iy+textflags)	; /
;--------------------------------------------------------
;-------- MainMenu
MainMenu: 
	call	fastcopy					;\ MainMenu
	ld	hl,MainMenuStr					; |
	call	Text_Select_Menu				; | [Clear Press]
	or	a	\	jp	z,quittoshell		; | Load Game
	dec	a	\	jp	z,LoadGame		; | New Game
	dec	a	\	jp	z,NewgameMenu		; | Quit
	dec	a	\	jp	z,quittoshell		;/
;--------------------------------------------------------
;-------- NewGameMenu
NewgameMenu:
	call	fastcopy
	set	textinverse,(iy+textflags)	
	ld	hl,NewGameDifficultyStr
	ld	de,$1800
	call	setvputs
	res	textinverse,(iy+textflags)	
	ld	hl,NewGameMenustr
	call	Text_Select_Menu
	or	a	\	jp	z,quittoshell
	dec	a	\	jp	z,EasyStart
	dec	a	\	jp	z,HardStart
	dec	a	\	jp	z,MainMenu
;---------> In game World <----------------
Main:								; main loop
#ifdef GreyScale					; GreyScale auto modification du code?	
	ld	a,(Greycounter)
	ld	hl,Worldtile
	ld	b,48	
	bit	0,a	\	jp	z,greyloop2
GreyLoop:
	rrc (hl)
	inc	hl
	djnz	greyloop
	res	0,a
	jr	exitgrey
GreyLoop2:
	rlc (hl)
	inc	hl
	djnz	greyloop2
	set	0,a
exitgrey:
	ld	(Greycounter),a		
#endif
;SSStock updating



	call	drawlevel	; Draw the current world

	call	drawperso	; Draw The Main Player

	call	ifastcopy	; copy the buffer to the screen
#ifdef WithTimer
	call	syncronize	; Wait for next 6 interrupt
#endif
#ifdef WithHalt
	ld	b,2
	call	delayb
#endif	
	call	incpersoanim	; Increase Perso Sprite

	call	kloop		; get input from user (kebord)

	jr	main


;###############################################3
;##########Animation for tilemap increase(AnimAdd for all tile)

incpersoanim:
	ld	hl,animtimer
	ld	a,15			; hl= timer for animation	
	cp	(hl)			; Nbre de passe avan dincreaser le pointer
	jr	z,inc_persoanim			
	inc	(hl)
	ret
inc_persoanim:
	xor	a			; reset A
	ld	(hl),a			; reset animtimer
	ld	a,(animadd_2anim)	; Inc Animadd
	cp	1
	jr	z,incperso		; if animadd=1 then reset
	inc	a
	ld	(animadd_2anim),a
	ret
incperso:
	xor	a			; Reset A
	ld	(animadd_2anim),a	; Reset animadd
	ret
;#############################################
;##########Keyloop############################

kloop:
	ld	a,0feh		; Activate keypad
	call	directin	; MirageOS directin routine 
	bit	0,a		; Down key
	jp	z,Downw
	bit	1,a		; Left key
	jp	z,Leftw
	bit	2,a		; Right key
	jp	z,Rightw
	bit	3,a		; Up key
	jp	z,upw
	
;	bcall(_GetCSC)		; ResetKey porg	
	
       	ld	a,0fdh		; Activate Clear Key
	call	directin
	sub	191	\	jp	z,SaveGame   ; Clear key

;	bcall(_GetCSC)		; ResetKey porg	


	ld	a,$bf		; Activate 2nd button
	call	directin	;
	cp	$BF		 \	jp	z,inGameMenu		; Mode Key
	cp	$7F		 \	jp	z,SaveGame		; Del Key
	sub	223		\	jp	z,doaction		; 2nd key
	ret			
;###########################################
;#World move routine########################
downw:					; Descendre sur la map
	xor	a				
	ld	(persodir),a
	call	copy_A_Y_xypospax_hl_de
	cp	48
	jp	z,Wjpl1			;Chk for bottom bug
	push	af
	inc	a
	ld	e,a
	call	chkmove
	ld	a,e
	ld	(XYPosofPerso+1),a
	pop 	af	
Wjpl1:	
	cp	48
	call	z,MoveMap
	call	persoaniminc
	ret			; ret for call
upw:
	ld	a,3
	ld	(persodir),a
	call	copy_A_Y_xypospax_hl_de
	push	af
	dec	a
	ld	e,a
	call	chkmove
	ld	a,e
	ld	(XYPosofPerso+1),a
	ld	a,3
	ld	(persodir),a
	pop	af
	or	a
	call	z,MoveMap
	call	persoaniminc
	ret			; ret for call
rightw:
	ld	a,1
	ld	(persodir),a
	call	copy_A_X_xypospax_hl_de	
	push	af
	inc	a
	ld	d,a
	call	chkmove
	ld	a,d
	ld	(XYPosofPerso),a
	pop	af
	cp	80
	call	z,movemap
	call	persoaniminc
	ret			; ret for call
leftw:
	ld	a,2
	ld	(persodir),a
	call	copy_A_X_xypospax_hl_de
	push	af
	dec	a
	ld	d,a
	call	chkmove
	ld	a,d
	ld	(XYPosofPerso),a
	pop	af
	or	a
	call	z,movemap
	call	persoaniminc
	ret			; ret for call
;#################################
;#######Routine pour faire une action	
doaction:
	ei
	halt
	ld	a,$BF
	call	directin	
	cp	$DF
	jr	z,doaction
	call	copy_xypos_hl_de	; Copier la position dans hl et de
	call	Calculate_PersoAdd	; Calculer le persoadd
	call	Add1onthemap		; calculer une case de plus sur la map
	ld	hl,spriteTable-2	; Hl pointe a la spritetable, le -2 est pour les inc
CompSpritLoop:
	inc	hl			; Increment le pointeur
	inc	hl			;
	push	hl			; Save le pointeur
	ld	a,(hl)			; Mise de la MSB dans A ( du pointeur)
	inc	hl			; Va cherché la LSB
	ld	l,(hl)			; Mise de la LSB dans l(destruction du pointeur)
	ld	h,a			; Mise de la MSB dans l(destruction du pointeur)
	ld	bc,$FFFF		; met FFFF dasn bc
	call	cphlbc			; VA voir si arrivé a la fin du pointeur
	jr	z,Chkfortheend	
	ld	a,(PersoParle)
	ld	b,a
	ld	a,(PersoParle+1)
	ld	c,a
	call	cphlbc
	pop	hl
	jr	nz,CompSpritLoop

ChkForJp:
	push	hl
	ld	a,(hl)
	inc	hl
	ld	l,(hl)
	ld	h,a
	ld	bc,$FFFF
	call	cphlbc
	pop	hl
	inc	hl
	inc	hl
	jp	nz,ChkForJp
	ld	a,(hl)
	inc	hl
	ld	h,(hl)
	ld	l,a
	jp	(hl)	
Chkfortheend:
	pop	hl
	inc	hl
	inc	hl
	push	hl
	ld	a,(hl)
	inc	hl
	ld	l,(hl)
	ld	h,a
	ld	bc,$FFFF
	call	cphlbc
	pop	hl
	ret	z
	jp	CompSpritLoop		
	
Add1onthemap:
	ld	hl,(persoadd)
	ld	a,(persodir)
	or	a
	jr	z,DownAdd1
	dec	a
	jr	z,RightAdd1
	dec	a
	jr	z,LeftAdd1
	dec	a
	jr	z,UpAdd1
	
DownAdd1:
	ld	de,0024h
	add	hl,de
	ld	(PersoParle),hl
	ret
UpAdd1:
	ld	de,0024h
	sbc	hl,de
	ld	(PersoParle),hl
	ret
RightAdd1:
	inc	hl
	ld	(PersoParle),hl
	ret
LeftAdd1:
	dec	hl
	ld	(PersoParle),hl
	ret
;###############Ces deux routine copie XYPosofPerso a A,Hl,De
copy_A_Y_xypospax_hl_de:
	call	copy_xypos_hl_de
	ld	a,(XYPosofPerso+1)
	ret
copy_A_X_xypospax_hl_de:
	call	copy_xypos_hl_de
	ld	a,(XYPosofPerso)
	ret
;#############This routine copy XYPosofPerso to hl and de
copy_xypos_hl_de:
	ld	a,(XYPosofPerso)
	ld	h,a
	ld	d,a
	ld	a,(XYPosofPerso+1)
	ld	e,a
	ld	l,a
	ret	
;#################################################
;########Anmation pointeur icrease!!!!!!!
persoaniminc:
	ld	hl,persoanim		; hl pointe a persoanim
	ld	a,3			; a est egal a 3
	cp	(hl)			; if a==3 then reset
	jr	z,persoanimincloop
	inc	(hl)			; else inc persoanim
	ret
persoanimincloop:
	ld	(hl),0			; reset hl
	ret	
;###################################################################
;######Procedure Subroutine#########################################
;###################################################################
;------------------------------------
;---Draw level----------------
Drawlevel:
	ld	de,(mapadd)
	ld	hl,(Wmap)
	add	hl,de
	ex	de,hl
	call	drawmap
	ret
;------------------------------------
;--DRAW PERSO----------------------
Drawperso:
	ld	hl,(persodir)		; Determiner quelle sprite dessiner
	ld	h,0		
	add	hl,hl
	ld	de,(persoanim)		
	srl	e
	ld	d,0

	add	hl,de
	add	hl,hl			; a=a*2
	add	hl,hl			; a=a*4
	add	hl,hl			; a=a*8
	add	hl,hl			; a=a*16
	add	hl,hl			; a=a*32
	add	hl,hl			; a=a*64
	
	ld	de,spriteperso
	add	hl,de
	push	hl
	pop	bc
	ld	a,(XYPosofPerso)
	ld	d,a
	ld	a,(XYPosofPerso+1)
	ld	e,a
	call	SprANDXOR
	ret
;-----------------------------------
;------Chkscrool Routine -----------
;Input: 	DE XY POS
;		Hl XY old position
;Output		DE REAL POS
ChkMove:
	push	hl
	push	de
	call	Calculate_PersoAdd
	call	Add_PersoAdd_WMap
	ld	a,(hl)
	sub	07h	; cp	07h
	jp	m,ScroolOk
	pop	hl
	pop	de
	ret

ScroolOK:
	pop	de
	pop	hl
	ret

ChkScrool:
	call	Add_PersoAdd_WMap
	ld	a,(hl)
	sub	07h
	ret	
;################This Routine calculate The mapadd var
	
Calculate_PersoAdd:
	push	de
	push	hl
	ld	a,(persodir)
	dec	a
	jr	z,rightchkscrool
	dec	a
	jr	z,leftchkscrool
; down & up
UpandDown:
	pop	hl
	pop	de
	ld	a,d
	add	a,8
	ld	d,a
	ld	a,e
	add	a,15
	ld	e,a
scroolinit:	
	srl	d	;X=X/2
	srl	d	;X=X/4
	srl	d	;X=X/8
	
	srl	e	;Y=Y/8
	srl	e	;Y=Y/8
	srl	e	;Y=Y/8
; Do Y*24+X	
	ld	a,d	;A=X
	ld	d,0	;D=0 , E=Y
	ld	hl,0	;HL=0
	add	hl,de	;Y=1Y
	add	hl,de	;Y=2Y
	add	hl,de	;Y=3Y
	add	hl,hl	;Y=6Y
	add	hl,hl	;Y=12Y
	ex	de,hl	;DE = 12Y
	ld	hl,0000h ; RESET HL
	add	hl,de	;Y=12Y
	add	hl,de	;Y=24Y
	add	hl,de	;Y=36Y	
	
	ld	d,0	;D=0
	ld	e,a	;E=A(X)
	
	add	hl,de	;Hl = Y*36+X
	ex	de,hl	;De = Persoadd
	ld	hl,(mapadd) 
	add	hl,de	;Hl = MapOffSetADD
	ld	(persoadd),hl
	ret

; Left
leftchkscrool:
	pop	hl
	pop	de
	ld	a,d
	add	a,3
	ld	d,a
	ld	a,e
	add	a,15
	ld	e,a
	jp	scroolinit
rightchkscrool:
; Right
	pop	hl
	pop	de
	ld	a,d
	add	a,12
	ld	d,a
	ld	a,e
	add	a,15
	ld	e,a
	jp	scroolinit
;#########################Cette routine aditionne persoadd a la map actuelle	
Add_PersoAdd_WMap:
	ld	hl,(persoadd)
	ld	de,(Wmap)
	add	hl,de
	ret		
;---------------------------------
;---Routine Pour Scrooler de map
;---Input DE = XY position
;----     HL = Old Xy Position
;----     (persodir)=Direction du perso 
; ----- Output Map is scrooled
MoveMap:
	ld	a,h
	ld	(XYPosofPerso),a
	ld	a,l
	ld	(XYPosofPerso+1),a
	
	Call Calculate_PersoAdd
	ld	a,(persodir)
	or	a	\	jp	z,scroolmap0
	dec	a	\	jp	z,scroolmap1
	dec	a	\	jp	z,scroolmap2
	dec	a	\	jp	z,scroolmap3		

; Scrooler par en bas
scroolmap0:		;BAS
	ld	hl,(persoadd)
	ld	de,0024h
	add	hl,de
	ld	(persoadd),hl
	call	chkscrool
	ret	p
	ld	b,8
scrool2:
	push	bc
	ld	hl,(mapadd)
	ld	bc,0024h
	add	hl,bc
	ld	(mapadd),hl
	call	drawlevel
	call	ifastcopy
	pop	bc
	djnz	scrool2
		
	xor	a
	ld	(XYPosofPerso+1),a
	ret			; ret for call

scroolmap1:		;Droite
	ld	hl,(persoadd)
	inc	hl
	ld	(persoadd),hl
	call	chkscrool
	ret	p
; scrooling map...
	ld	b,12
scrool:
	push	bc
	ld	hl,(mapadd)
	inc	hl
	ld	(mapadd),hl
	call	drawlevel
	call	ifastcopy
	pop	bc
	djnz scrool
	xor	a
	ld	(XYPosofPerso),a
	ret			; ret for call
scroolmap2:		;Gauche
	ld	hl,(persoadd)
	dec	hl
	ld	(persoadd),hl
	call	chkscrool
	ret	p
	ld	b,12
scroolall:
	push	bc
	ld	hl,(mapadd)
	dec	hl
	ld	(mapadd),hl
	call	drawlevel
	call	ifastcopy
	pop	bc
	djnz scroolall
	
	ld	a,50h
	ld	(XYPosofPerso),a
	ret		; ret for call


scroolmap3:		; Up
	ld	hl,(persoadd)
	ld	de,0024h	;24
	sbc	hl,de
	ld	(persoadd),hl
	call	chkscrool				
	ret	p
	ld	hl,mapadd
	inc	(hl)
	ld	b,8
scrool3:
	push	bc
	ld	hl,(mapadd)
	ld	de,0024h
	sbc	hl,de
	ld	(mapadd),hl
	call	drawlevel
	call	ifastcopy
	pop	bc
	djnz	scrool3	

	ld	a,2Fh
	ld	(XYPosofPerso+1),a	
	ret			; ret for call

; #############################3
;###Petite routine qui met des str en noir sur blanc
;PutMultipleStrInBlack:
;	ld	a,(hl)
;	inc	a	\	ret	z
;	call	GrBufBackup
;	call	PutStrInBlack
;	push	hl
;	ld	b,6
;	call	delayb
;	
;	call	D_I_Waitkey
;	call	GrBufResBackup
;	pop	hl
;	jr	PutMultipleStrInBlack
;	
PutStrInBlack:
	set	3,(iy+05h)		; Textinverse
	ld	b,(hl)
	push	hl
	ld	de,12*7
	ld	hl,0000h
PtStLoP:
	add	hl,de
	djnz	PtStLoP
	ld	b,h
	ld	c,l
	dec	bc
	ld	hl,plotsscreen
	ld	(hl),11111111b
	ld	de,plotsscreen+1
 	ldir
 	pop	hl
	ld	b,(hl)
	inc	hl
 	ld	de,$0000
	set	7,(iy+14h)		; TextWrite

TextLoop:
	ld	(pencol),de
	bcall(_vputs)
	ld	a,7
	add	a,d
	ld	d,a
	djnz	TextLoop
	push	hl
	res	7,(iy+14h)		; TextWrite
	res	3,(iy+05h)		; Textinverse
	call	fastcopy
	pop	hl
	ret

#include "include/ldsvgam.z80"
#include "include/perso.z80"
#include "include/lib.z80"
#include "include/Menu.z80"
#include "include/sprand.z80"
#include "include/game.z80"
#include "include/data.z80"        ; Never forget to put it at the end

.end
END
