; ************** Orzunoid On-Calc Universe Editor ************************ .include "usgard.h" .org 0 .db "Orzunoid On-calc Editor 1.0",0 temp_data =TEXT_MEM+33 data =TEXT_MEM+33 name_storage =TEXT_MEM var_pointer =TEXT_MEM+19 x =TEXT_MEM+21 y =TEXT_MEM+22 timer =TEXT_MEM+23 ; ************** Editor / Universe Initialization ************************ call CLEARLCD ;Display title ld ($800c),de ld hl,&nameinput call D_ZT_STR ld c,8 ;Input level name ld a,16 ld ix,name_storage #fncall INP_ST get_variable: ld hl,name_storage ;Test variable's existence ld a,(hl) or a ret z call VAR_GET jr nc,var_already_exists ld hl,name_storage ;Create new variable ld a,12 ld bc,290 call VAR_NEW ret c call &fill_var jr get_variable var_already_exists: ld (var_pointer),hl ;Test if it's an OOCE level ld a,(de) cp $c ret nz inc hl inc hl inc hl ld a,'O' cp (hl) jr nz,convert inc hl cp (hl) jr nz,convert inc hl ld a,'c' cp (hl) jr nz,convert inc hl ld a,'E' cp (hl) jp z,&main_section ; ************** Level Converter ***************************************** convert: call CLEARLCD ;Ask whether to convert ld ($800c),de ld hl,&ask_convert call D_ZT_STR convert_query: call GET_KEY cp K_F5 ret z cp K_F1 jr nz,convert_query ld hl,&orzunoid_name ;De-activate Orzunoid call VAR_GET push af jr c,no_orzunoid1 ld hl,-6 add hl,de set 7,(hl) no_orzunoid1: push hl ld hl,name_storage ld de,$fc00 ld bc,9 ldir ld hl,name_storage ;Execute level call VAR_EXEC pop hl ;Re-activate Orzunoid pop af jr c,no_orzunoid2 res 7,(hl) no_orzunoid2: ld hl,(DELC_LEN) ;Test level ld de,20432 call CP_HL_DE ret nz xor a ld (DELC_LEN),a ld de,name_storage ld hl,$fc00 ld bc,9 ldir ld hl,name_storage ;Resize level ld bc,290 call VAR_RESIZE ret c call &fill_var ;Update string ld hl,-169 add hl,de ex de,hl ld hl,DELC_LEN+2 ld bc,96 ldir jp &get_variable ; ************** Editor Main Screen ************************************** main_section: ;Display main screen call CLEARLCD ld ($800c),de ld hl,&title_screen call D_ZT_STR main_loop: ;Read user input call GET_KEY cp K_EXIT ret z cp K_F1 jr z,edit_first cp K_F2 jr z,edit_second cp K_F3 jr z,edit_third cp K_F4 jr z,edit_fourth cp K_F5 jr z,edit_fifth jr main_loop edit_fourth: ;Selects level to edit ld e,$d9 jr edit_level edit_fifth: ld e,$f9 jr edit_level edit_first: ld e,$79 jr edit_level edit_second: ld e,$99 jr edit_level edit_third: ld e,$b9 ; ************** Actual Editing Screen *********************************** edit_level: ;Decodes level from file ld hl,(var_pointer) ld d,0 add hl,de push hl call &actual_level_loader call CLEARLCD ;Display editor screen ld e,6 ld ($800c),de ld hl,&editor_message call D_ZT_STR edit_loop: call GET_KEY cp K_ENTER jp z,&save_levels ld hl,CONTRAST cp K_PLUS jr nz,no_plus push af ld a,(hl) cp $1f jr z,no_inc inc a ld (hl),a out (2),a no_inc: pop af no_plus: cp K_MINUS jr nz,no_minus push af ld a,(hl) or a jr z,no_dec dec a ld (hl),a out (2),a no_dec: pop af no_minus: ld hl,x cp K_LEFT jr nz,noleft dec (hl) noleft: cp K_RIGHT jr nz,noright inc (hl) noright: inc hl cp K_UP jr nz,noup dec (hl) noup: cp K_DOWN jr nz,nodown inc (hl) nodown: push af ld hl,x ld a,(hl) and 15 ld b,a inc hl ld a,(hl) and 7 add a,a add a,a add a,a add a,a add a,b ld l,a ld h,$81 pop af cp K_F1 jr nz,nof1 ld (hl),0 nof1: cp K_F2 jr nz,nof2 ld (hl),1 nof2: cp K_F3 jr nz,nof3 ld (hl),2 nof3: cp K_F4 jr nz,nof4 ld (hl),3 nof4: ld ix,GRAPH_MEM ld hl,temp_data ld b,8 rs_outer:push bc ld b,16 rs_inner:ld a,(hl) or a jr z,clear_block dec a jr z,draw_block dec a JR Z,draw_block_tough ld (ix+0),255 ld (ix+16),255 ld (ix+32),255 ld (ix+48),255 ok: inc hl inc ix djnz rs_inner ld de,48 add ix,de pop bc djnz rs_outer ld hl,timer ld a,(hl) inc a ld (Hl),a rra jr c,noflicker ld hl,x ;Draw positioning dot ld a,(hl) and 15 ld b,a inc hl ld a,(hl) and 7 add a,a add a,a add a,a add a,a add a,a ld h,0 add a,a rl h add a,b ld l,a ld de,$8651 add hl,de ld a,(hl) xor %00011000 ld (Hl),a ld de,16 add hl,de ld (hl),a noflicker: ld hl,GRAPH_MEM ;Draw level on screen ld de,$fc00 ld bc,512 halt ldir jp &edit_loop clear_block: ld (ix+0),0 ld (ix+16),0 ld (ix+32),0 ld (ix+48),0 jp &ok draw_block: ld (ix+0),255 ld (ix+16),129 ld (ix+32),129 ld (ix+48),255 jp &ok draw_block_tough: ld (ix+0),255 ld (ix+16),195 ld (ix+32),195 ld (ix+48),255 jp &ok save_levels: ;Save edited levels ld b,32 ld hl,temp_data pop de loop: xor a push bc ld b,4 loopi: add a,a add a,a or (hl) inc hl djnz loopi pop bc ld (DE),a inc de djnz loop jp &main_section ; ************** Fill In Variable **************************************** fill_var: ld hl,name_storage call VAR_GET ret c ex de,hl ld hl,&string_part1 ld bc,string_part2-string_part1 ldir ld hl,name_storage ld bc,10 ldir ld hl,&string_part2 ld bc,string_part3-string_part2 ldir ld bc,159 ex de,hl call OTH_CLEAR ld hl,&string_part3 ld bc,string_end-string_part3 ldir ret ; ************** Level Code ********************************************** string_part1: .DB $00,$F8,$12 ;Usgard file header .DB "OOcE Orz6+ Levels",0 ;Level description ld de,TEXT_MEM2 ;Load data block ld bc,14 ld hl,$38 ldir ld hl,$2f ;Run Orzunoid call VAR_EXEC ld hl,0 ;Clear signal to Orzunoid ld (TEXT_MEM2),hl ld a,3 ld (USG_BITS),a ret .db "Orzunoid",0 ;Name of string to run .dw 52682 ;Data table .dw $46 ;Name (9 bytes) and version (1 byte) go in-between string_part2: ld hl,$52 ;Update Orzunoid control block ld (TEXT_MEM2+26),hl ld a,5 ld (TEXT_MEM2+37),a ret extract_level: ld hl,$56 ;New level loader code ld b,a inc b ld de,32 find_level_loop: add hl,de djnz find_level_loop actual_level_loader: ld b,32 ld de,data set_up_1: push bc ld b,4 ld c,(hl) loop_row: rlc c rlc c ld a,c and 3 ld (de),a inc de djnz loop_row inc hl pop bc djnz set_up_1 ret ;160 bytes of level data go in-between string_part3: .db $19,$05,$1C ;Usgard reloc table .db $0D,$0C,$FB ;(or something) .db $FF,$05,$00 string_end: ; ************** OOCE Text Messages ************************************** nameinput: .db "----> OOCE v1.0 <----" .db " Enter name of levels" .db "to create or edit: ",0 title_screen: .db "Orzunoid Level Editor" .db "F1) Edit First Level " .db "F2) Edit Second Level" .db "F3) Exit Third Level " .db "F4) Exit Fourth Level" .db "F5) Exit Fifth Level " .db "EXIT) Quit OOCE!",0 editor_message: .db "F1-F4 to place bricks" .db "ENTER when finished",0 ask_convert: .db " This is not an OOCE" .db "1.0 level, but may be" .db "another type of level" .db "for Orzunoid. " .db "F1) Try to convert it" .db "F5) Exit",0 orzunoid_name: .db "Orzunoid",0 .end