dos33fsprogs/ootw
Vince Weaver ad8e0e05c3 ds: updated dissolve sprites for alien
also can shoot through shields now
2019-11-05 11:52:43 -05:00
..
intro_graphics
ootw_audio ootw: outtro more or less working 2019-08-21 13:24:12 -04:00
ootw_graphics ootw: aliens can shoot. also make laser collision code generic 2019-08-22 12:21:18 -04:00
alien_laser.s ootw: can now turn off power by shooting wire 2019-08-22 13:06:02 -04:00
alien.s ootw: c2: slow alien fire rate 2019-08-22 15:34:00 -04:00
audio.s ootw: getting silly with audio 2019-07-15 01:24:29 -04:00
blast.s ds: updated dissolve sprites for alien 2019-11-05 11:52:43 -05:00
charger.s ootw: c4: implement gun charger 2019-08-14 13:59:58 -04:00
collision.s ootw: c2: finally fix walls issue 2019-08-22 15:34:15 -04:00
compress_test.s
door.s ootw: c2: can now blast shields away 2019-08-20 14:15:02 -04:00
dummy_friend.s ootw: c2: can now disintegrate friend (from left) 2019-08-20 14:02:49 -04:00
earthquake.s
empty.dsk ootw: add last sprites and fix some keyboard handling 2019-08-16 13:15:07 -04:00
ending.s ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
FAQ update README to have some more keyboard gameplay hints 2019-08-30 11:39:35 -04:00
friend.s ootw: adding aliens to levels, other small fixes 2019-08-22 10:04:06 -04:00
gr_copy_offset.s ootw: c2: pre-load dome in advance 2019-07-12 13:12:06 -04:00
gr_copy.s
gr_fast_clear.s
gr_hlin.s ootw: c4: initial laser support 2019-08-09 21:46:04 -04:00
gr_make_quake.s
gr_offsets_hl.s ootw: split off hl offsets 2019-07-12 00:59:42 -04:00
gr_offsets.s ootw: split off hl offsets 2019-07-12 00:59:42 -04:00
gr_overlay.s
gr_pageflip.s
gr_plot.s
gr_putsprite_crop.s ootw: putsprite_crop now crops off top of screen too 2019-08-09 14:28:50 -04:00
gr_putsprite_flipped.s
gr_putsprite.s
gr_run_sequence.s ootw: add back intro, skip ifescape pressed 2019-07-20 12:17:25 -04:00
gr_twoscreen_scroll.s ootw: c4: falling into pit more or less works 2019-08-09 13:58:58 -04:00
gr_unrle.s
gr_vlin.s ootw: laser 2019-07-18 21:01:54 -04:00
gun.s ootw: can now shoot while crouching 2019-08-16 13:53:37 -04:00
hardware.inc ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
hello2.bas ootw: add second disk with images 2019-08-21 00:36:27 -04:00
hello.bas ootw: release version 2.9 2019-08-22 15:41:43 -04:00
interrupt_handler.s ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
intro_data_01.s
intro_data_04.s
intro_data_06.s
intro_data_08.s
intro_data_09.s
intro.s ootw: intro2 working 2019-03-20 14:41:31 -04:00
keyboard.s ootw: c1: fix issue where left/right don't clear keypress strobe 2019-08-17 18:47:27 -04:00
laser.s ds: updated dissolve sprites for alien 2019-11-05 11:52:43 -05:00
loader2.s ootw: add second disk with images 2019-08-21 00:36:27 -04:00
loader.s ootw: c5: add level5 (this is probably a mistake) 2019-08-08 15:38:10 -04:00
lz4_decode.s
Makefile ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
ootw_c1_arrival.s ootw: underwater scene is playable 2019-07-31 00:11:30 -04:00
ootw_c1_beast.s ootw: remove some debugging 2019-08-19 16:38:02 -04:00
ootw_c1_cavern.s ootw: c1: declaring level1 done 2019-08-20 00:28:47 -04:00
ootw_c1_mesa.s ootw: c1: URGH finall got beast ending acceptable state 2019-08-19 16:20:28 -04:00
ootw_c1_pool.s ootw: remove some debugging 2019-08-19 16:38:02 -04:00
ootw_c1_rope.s ootw: c1: beast behaves better in rope room 2019-08-19 11:31:11 -04:00
ootw_c1_sluggy.s ootw: c1: add code to clean up slugs when leave room 2019-08-20 00:20:04 -04:00
ootw_c1.s ootw: c1: declaring level1 done 2019-08-20 00:28:47 -04:00
ootw_c2_cage.s ootw: c2: fix bug where other aliens drawn in corner during intro 2019-08-22 13:42:27 -04:00
ootw_c2_elevator.s ootw: centralize gun handling, level5 now works properly 2019-08-16 10:12:44 -04:00
ootw_c2_intro.s ootw: add back intro, skip ifescape pressed 2019-07-20 12:17:25 -04:00
ootw_c2_jail.s ootw: c2: add initial shield 2019-08-22 13:27:18 -04:00
ootw_c2_miners.s ootw: more work on cage end 2019-07-19 21:01:42 -04:00
ootw_c2.s ootw: c2: re-activate opening cutscenes 2019-08-22 13:28:12 -04:00
ootw_c3_vent.s ootw: c3: fix issue where not show falling in because PHYSICIST_Y was negative 2019-08-15 23:53:59 -04:00
ootw_c3.s ootw: remove unneeded includes to save space 2019-08-17 18:12:04 -04:00
ootw_c4_action.s ootw: c4: action sequence hooked up 2019-08-14 09:45:13 -04:00
ootw_c4_city.s ootw: c4: fix bug where door was missing at end of level 2019-08-22 15:41:21 -04:00
ootw_c4.s ootw: first steps at alien laser firing 2019-08-22 11:54:21 -04:00
ootw_c5_cave.s ootw: add crouch kicking, start hooking up more doors l2 2019-08-16 16:32:59 -04:00
ootw_c5.s ootw: aliens can shoot. also make laser collision code generic 2019-08-22 12:21:18 -04:00
ootw_side2.dsk ootw: release version 2.9 2019-08-22 15:41:43 -04:00
ootw.dsk ootw: fix bug where beast out also gave you the gun in level1 2019-08-23 18:59:43 -04:00
physicist.s ootw: can now get shot by aliens 2019-08-22 13:20:10 -04:00
pt3_lib_core.s ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
pt3_lib_init.s ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
pt3_lib_irq_handler.s ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
pt3_lib_mockingboard.s ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
pt3_setup.s ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00
random16.s
README ds: missing section works 2019-10-08 21:57:48 -04:00
shield.s ootw: c4: shields now more or less OK 2019-08-14 12:21:45 -04:00
text_print.s ootw: c3: "implement" checkpoint3 2019-07-12 13:40:29 -04:00
TODO ootw: another bug, ledge in L4 2019-08-23 19:23:05 -04:00
zp.inc ootw: update to newer pt3_lib 2019-09-12 00:51:17 -04:00

Another / Out-of-This World Demake for Apple II+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	by Vince "Deater" Weaver (vince@deater.net) 
		http://www.deater.net/weave/vmwprod/ootw/
	Disk and LZ4 routines by qkumba

+ The game "Another World" was released in 1991.
	Written by Eric Chahi.
  It was eventually ported to many systems (I played it on IBM PC).

  It even got an Apple IIgs port (the IIgs is 16-bit with fancy
	graphics and sound).  However you couldn't play it on
	earlier Apple II systems... until now.

+ I was inspired to do this by this amazing PICO-8 version of:
	https://liquidream.itch.io/another-world-survival

  and thought the Apple II lo-res palette (15 colors, 40x48 graphics)
  might be just barely enough to do it justice.

==================
Game controls:
==================

  This info appears while loading too, but if you are in an emulator with
	fast disk access it might not be on the screen long enough to see.

	D ->		- move right (twice to run)
	A <-		- move left (twice to run)
	W up		- jump
	S down		- crouch / pickup
	space		- kick / gun
	L		- charge weapon

  During the intro, you can press R to make it repeat forever.

  Hints for those who have never actually played the original game:

	+ At initial arrival, hit up a bunch of times to escape the
		tentacle monster.  On an original II w/o autorepeat
		you might have to bang on the keyboard a lot.
	+ You can kick some enemies.  Crouch-kicking is sometimes
		a bit easier than stand-kicking.
	+ When running (i.e. after pressing left or right twice)
		you can press "up" to run-jump which is faster than
		plain running.  That might be useful if you need
		to out-run something.
	+ When you get the gun, use space to fire the laser.
		You can use "L" to charge your gun for special actions.
		Charge a little bit then press "L" (or any key)
		to create a shield.
		Charge a longer time (a few seconds, when the charge
		ball gets bigger) and it will make a giant blast capable
		of destroying doors and shields.


  Note: the original Apple II had no up/down buttons, which is why
	you can also use WASD for movement.  Different emulators handle
	this differently, but if for some reason up/down is not working
	try using W/S instead.

  Joystick support: none yet?
	It should be possible, I just haven't had time to implement yet.

  Keyboard Limitations:
	Note, Apple II has simplistic keyboard support.
	In general it's not possible to read more than one key at a time.
	Additionally, on older models there's no auto-repeat unless you
		hold down the REPT key, which makes running difficult.
	This means it's really not possible to use the keyboard the
		same way as the original game (which had you do things
		like holding down spacebar to charge the gun and then
		firing when you release it.  Same for running faster
		by holding left/right and space at the same time).

==================
Development notes:
==================

Ootw Memory map:
	00	zero page
	01	stack
	02	????
	03	nibble table/disk data
	04-07	GR page0
	08-0b	GR page1
	0c-0f	background  ($c00 = disk load buffer)
	10-13	background overlay
	14-16	loader
	17-bf	program-data (41.25k)
	bc-bf   earthquake background (shifted)
	c0-cf	I/O
	d0-ff	ROM


Intro Memory map:
	00	zero page
	01	stack
	02	????
	03	nibble table/disk data
	04-07	GR page0
	08-0b	GR page1
	0c-0f	offscreen data  ($c00 = disk load buffer)
	10-13	offscreen data2
	14-16	loader
	17-89	program/compressed-data (30.25k)
	90-bf	currently decompressed level data (12k)
	c0-cf	I/O
	d0-ff	ROM


Intro Memory squeeze!

	10,748 over	all graphics in
	10,734 over	remove extraneous blank bg image
	 8,658 over	re-arrange memory map, 42k avail now
	 8,562 over	move gr_make_quake out of common code
	 8,374 over	remove extraneous code (mostly put_sprite_flipped)
	 5,469 over     allow changing bg on fly in sequence
	 4,122 over	modify cyan frames to be on fly
	 2,749 over	do same for zappo routines
	 2,493 over	squish disk loader vars to page 3
	 2,165 over	horrible hack to auto-go to next image in sequence
	 2,114 over	move bg loading into seq
	 2,053 over	make elevator indicator a loop
	 1,347 over	use LZ4 instead of RLE

Gave up, see if we can compress in chunks and decompress, sort of like
my chiptune player does.


Let's take a 12k region of memory = $3000
	$C000 - $3000 = starting at $9000


ID1 =	1461		2143\
ID2 =   1759		2687|--- together in 01
ID3 =	1195		1879/
ID4 =   2514		8280\--- in 04
ID5 =	1947		3492/
ID6 =	2584		3610\ --- in 06
ID7 =   2834		3606/
ID8 =	3705		4918 | -- in 08
ID9 =	4494		5901\  -- in 09
ID10 =	3397		5558/
	=====          ======
	25890             12k


ootw memory squeeze:
	after full rope sequence in:	23065
	make transparent overlays:	13971
	add end-of-l1 cutscene:		26464
	make transparent overlays:	17821
	add in rest of end cutscene	23906
	make those transparent		21236


ootw2 memory squeeze:
	before intro			3872
	after intro			9234




L2 Memory map:
	00	zero page
	01	stack
	02	????
	03	nibble table/disk data
	04-07	GR page0
	08-0b	GR page1
	0c-0f	offscreen data  ($c00 = disk load buffer)
	10-13	offscreen data2
	14-16	loader
	

	c0-cf	I/O
	d0-ff	ROM



since there seems to be vague interest in this, reasons to use the
various graphics modes.

lores benefits:
+ 40x48, 15 colors (two greys) (which is fine, as I use one for sprite transparency)
+ hardware page flipping
+ each display only 1kB (leaving lots of room for code) (also fast to clear screen)
+ (software) sprites and animations are relatively small

lores downsides:
+ blocky
+ pixels are rectangular
+ framebuffer is non-linear (to get to next line requires a lookup table, not a simple add)
+ odd/even lines are high/low nibble in a byte, so to draw sprites properly need a lot of shifting an masking (I cheat and only allow sprites on even lines)
+ framebuffer has "memory holes" between lines.  These are areas of memory reserved for expansion card use, so you can't just load a 1kB image straight to the framebuffer as it could break things.
+ NTSC artifact fringing between colors
+ lores PAGE2 is not frequently used so is broken in some emulators and on some early IIgs models


hires benefits:
+ 140x192 6 colors
+ hardware page flipping

hires downsides:
+ non-linear framebuffer even worse than lo-res
+ 8kB per page.  two pages of hires takes 1/3 of total RAM in an Apple II+
+ NTSC artifact color.  If the bit patterns in adjacent pixels is 00 it makes black, 11 makes white, so if you join two different colors you get lines between them
+ you get 7 pixels per 2-bytes.  Which means a lot of dividing by 7, slow on 6502
+ each 3.5 pixels has a bit indicating palette (black,white,green,purple) or (black,white,orange,blue).  You get zx-spectrum like color clash if you try to mix colors too close together
+ to get fast software sprites usually you make a set of 7 pre-shifted versions of the sprites, which takes up a lot of room



double-lores
+ 80x48, 15 colors
+ requires IIe or newer (80 column card)
+ requires drawing extra 1kB of data to bank-switched AUX RAM
+ AUX ram colors are shifted one bit to left from main bank colors
+ while it's possible to get hardware page flipping, it's really complex

double-hires
+ 140x192, 15 colors!
+ requires IIe or newer and 128k of RAM
+ requires drawing 8k of additional data to bank-switched AUX RAM
+ again, page flipping is complex


In any case, I chose lo-res for the Another World conversion for 3 reasons
1. Another World traditionally has 16 colors (and I like the lo-res colors)
2. I wanted to fit levels in 48k, and as many as possible on a 140k disk
3. I am too lazy to implement a full hi-res sprite library


The recent C64 Another World conversion looks much more impressive and hi-res,
but I think they use a 1MB cartridge just for the intro movie alone
(which is possible larger than the size of the original game for the Amiga).