KevKelley Posted August 25, 2018 Share Posted August 25, 2018 This is awesome. I had recently started programming for the Atari. My skill level might not be up there yet but seeing all of your updates and improvements over the years is encouraging and makes me want to finish my game. It also makes me really want to buy this game once completed and hopefully on a cart. 2 Quote Link to comment Share on other sites More sharing options...
ultima Posted August 26, 2018 Author Share Posted August 26, 2018 Bugfix removed cheat code and fixed playfield glitch update in first post 5 Quote Link to comment Share on other sites More sharing options...
NML32 Posted August 26, 2018 Share Posted August 26, 2018 After killing a large serpent I was trapped in the wall. Quote Link to comment Share on other sites More sharing options...
ultima Posted August 27, 2018 Author Share Posted August 27, 2018 (edited) After killing a large serpent I was trapped in the wall. I was afraid of that. I can add a small video to move the player to a safe zone so this won't happen. It will go in the next update. ***update is in first post -fixed player (if serpent is killed and your standing to far toward the bottom player will automatically move out of the way) -revised A.I. (exploiting the fire demon AI to make enemys spaz out was throwing the scanline count out by 1) Edited August 27, 2018 by ultima 2 Quote Link to comment Share on other sites More sharing options...
NML32 Posted August 27, 2018 Share Posted August 27, 2018 Two bugs: One hit freeze enemy and double entry on inventory bar. 1 Quote Link to comment Share on other sites More sharing options...
+Karl G Posted August 27, 2018 Share Posted August 27, 2018 What emulator are you using in this video? Quote Link to comment Share on other sites More sharing options...
NML32 Posted August 27, 2018 Share Posted August 27, 2018 What emulator are you using in this video? MiSTer FPGA more details are listed in the Video's description. Quote Link to comment Share on other sites More sharing options...
+Karl G Posted August 27, 2018 Share Posted August 27, 2018 I am wondering if the double entry on the inventory bar is specific to your FPGA implementation, since I'm not seeing it in Stella or on hardware. I also noticed that there are horizontal lines in the left of the screen (HMOVE bars) which don't appear in Stella or on hardware. To me, this would make me wonder if what you are using doesn't treat an early HMOVE (used to hide those video artifacts) the same way as the hardware or Stella does - which could throw off the timing for the inventory bar, and cause a duplicate like that. Just a thought. Quote Link to comment Share on other sites More sharing options...
NML32 Posted August 27, 2018 Share Posted August 27, 2018 I am wondering if the double entry on the inventory bar is specific to your FPGA implementation, since I'm not seeing it in Stella or on hardware. I also noticed that there are horizontal lines in the left of the screen (HMOVE bars) which don't appear in Stella or on hardware. To me, this would make me wonder if what you are using doesn't treat an early HMOVE (used to hide those video artifacts) the same way as the hardware or Stella does - which could throw off the timing for the inventory bar, and cause a duplicate like that. Just a thought. you're probably correct. If I run the AFP version on the FPGA I don't see the double inventory. Quote Link to comment Share on other sites More sharing options...
ultima Posted August 28, 2018 Author Share Posted August 28, 2018 (edited) Two bugs: One hit freeze enemy and double entry on inventory bar. Sorry I forgot to remove my personal debug menu that's why the enemy freeze. I put rev2 on the first post. the double score is what Karl mentioned if you use the right rom it should fix the issue (one is for a console and the one with the score fix is for the portable(AFP)) Edited January 11, 2019 by ultima 1 Quote Link to comment Share on other sites More sharing options...
NML32 Posted August 28, 2018 Share Posted August 28, 2018 I played through the AFP, and the only thing I noticed was some screens had items that were visible and unobtainable. Quote Link to comment Share on other sites More sharing options...
ultima Posted August 28, 2018 Author Share Posted August 28, 2018 I played through the AFP, and the only thing I noticed was some screens had items that were visible and unobtainable. AFP-1.JPG AFP-2.JPG AFP-3.JPG That's the effect from Odin's Eye you can see things that normally are not visible. The runes you see open those doors with the correct rune.? 1 Quote Link to comment Share on other sites More sharing options...
NML32 Posted August 29, 2018 Share Posted August 29, 2018 That's the effect from Odin's Eye you can see things that normally are not visible. The runes you see open those doors with the correct rune.? Ahhh, that makes sense now. Quote Link to comment Share on other sites More sharing options...
ultima Posted August 31, 2018 Author Share Posted August 31, 2018 Since I'm not seeing any more issues I'll say this game is finished. Just going to work on the manual and PAL version. 3 Quote Link to comment Share on other sites More sharing options...
abaudrand Posted September 7, 2018 Share Posted September 7, 2018 Awesome. 1 Quote Link to comment Share on other sites More sharing options...
MrBeefy Posted September 29, 2018 Share Posted September 29, 2018 Nice I need to try this one out again. So many good looking brews and not enough time to play. 2 Quote Link to comment Share on other sites More sharing options...
Arenafoot Posted September 30, 2018 Share Posted September 30, 2018 Nice I need to try this one out again. So many good looking brews and not enough time to play. I'll second that!!! https://drive.google.com/file/d/1TYGgJaphZRQ31LvNfCHovEWYB-c_g3Ba/view 1 Quote Link to comment Share on other sites More sharing options...
ultima Posted December 24, 2018 Author Share Posted December 24, 2018 Here I've done some code with tables First is 22 of your if statements (put in to a more tabular form) then the same thing with tables. Each if statement takes a minimum of 7 cycles so if you fall through all 22 that by it self takes 154 cycles. If the if statements represent 1/3 of the possible rooms and the rooms come up at random (they probably don't) 2/3 of the time you'll spend 154 cycles just to decide you don't want to do anything. If you do take the if statement then on average you'll do half of them or about 77 cycles (again if the rooms are random which they probably aren't) plus the 50 cycles or so that it takes for the rest it. In the case of the tables it does a look up to decide if it needs to do anything, that takes about nine cycles (versus 154). The rest of the table code takes 180 cycles or so (versus the 77 + 50) But that's all sort of worst case. It might be faster it might not. I don't think it would be much worse. It takes about 1/3 the ROM Of course, it's not tested but it does compile. set romsize 32k set optimization noinlinedata dim _Room = r dim _Bit5_Frozen = f bank 2 dispatch2 bank 3 dispatch3 DS7 mk1 if _Room = 2 && player1x > 72 && player1x < 85 && player1y < 55 then _Room = 46 : player1y = 85 : _Bit5_Frozen{5} = 0 : goto DS46 bank5 ; 01 1 if _Room = 4 && player1x > 66 && player1x < 86 && player1y > 45 && player1y < 55 then _Room = 42 : player1x = 117 : player1y = 85 : _Bit5_Frozen{5} = 0 : goto DS42 bank5 ; 02 0 if _Room = 5 && player1x > 108 && player1x < 118 && player1y < 65 then _Room = 39 : player1y = 84 : _Bit5_Frozen{5} = 0 : goto DS39 bank4 ; 03 10 if _Room = 6 && player1x > 44 && player1x < 56 && player1y < 71 then _Room = 27 : player1x = 78 : player1y = 85 : _Bit5_Frozen{5} = 0 : goto DS27 bank4 ; 04 3 if _Room = 7 && player1x > 114 && player1x < 134 && player1y < 25 then _Room = 37 : player1y = 18 : _Bit5_Frozen{5} = 0 : goto DS37 bank4 ; 05 8 if _Room = 8 && player1x > 62 && player1x < 77 && player1y > 52 && player1y < 62 then _Room = 40 : player1x = 21 : player1y = 85 : _Bit5_Frozen{5} = 0 : goto DS40 bank4 ; 06 11 if _Room = 9 && player1x > 49 && player1x < 70 && player1y < 24 then _Room = 66 : player1y = 84 : _Bit5_Frozen{5} = 0 : goto DS66 bank5 ; 07 7 if _Room = 10 && player1x > 80 && player1x < 91 && player1y > 55 && player1y < 63 then _Room = 31 : player1x = 77 : player1y = 77 : _Bit5_Frozen{5} = 0 : goto DS31 bank4 ; 08 4 if _Room = 13 && player1x > 46 && player1x < 66 && player1y > 40 && player1y < 46 then _Room = 37 : player1y = 84 : _Bit5_Frozen{5} = 0 : goto DS37 bank4 ; 09 8 if _Room = 15 && player1x > 87 && player1x < 96 && player1y > 60 && player1y < 77 then _Room = 25 : player1x = 78 : _Bit5_Frozen{5} = 0 : goto DS25 bank4 ; 10 1 if _Room = 18 && player1x > 99 && player1x < 113 && player1y > 40 && player1y < 47 then _Room = 38 : player1y = 84 : _Bit5_Frozen{5} = 0 : goto DS38 bank4 ; 11 9 if _Room = 19 && player1x > 51 && player1x < 64 && player1y < 63 then _Room = 26 : player1x = 78 : player1y = 85 : _Bit5_Frozen{5} = 0 : goto DS26 bank4 ; 12 2 if _Room = 24 && player1x > 58 && player1x < 78 && player1y < 62 then _Room = 32 : player1x = 46 : player1y = 85 : _Bit5_Frozen{5} = 0 : goto DS32 bank4 ; 13 5 if _Room = 32 && player1x > 88 && player1x < 104 && player1y < 31 then _Room = 34 : player1y = 85 : _Bit5_Frozen{5} = 0 : goto DS34 bank4 ; 14 6 if _Room = 35 && player1x > 96 && player1x < 106 && player1y < 62 then _Room = 36 : player1y = 85 : _Bit5_Frozen{5} = 0 : goto DS36 bank4 ; 15 7 if _Room = 37 && player1x > 124 && player1x < 134 && player1y > 28 then _Room = 7 : player1y = 34 : _Bit5_Frozen{5} = 0 : goto DS7 bank3 ; 16 if _Room = 41 && player1y < 55 then _Room = 56 : player1x = 25 : player1y = 84 : _Bit5_Frozen{5} = 0 : goto DS56 bank5 ; 17 5 if _Room = 47 && player1x > 32 && player1x < 52 && player1y < 47 then _Room = 48 : player1y = 75 : _Bit5_Frozen{5} = 0 : goto DS48 bank5 ; 18 2 if _Room = 51 && player1x > 114 && player1x < 134 && player1y < 47 then _Room = 50 : player1y = 75 : _Bit5_Frozen{5} = 0 : goto DS50 bank5 ; 19 3 if _Room = 52 && player1x > 71 && player1x < 90 && player1y < 47 then _Room = 51 : player1y = 84 : _Bit5_Frozen{5} = 0 : goto DS51 bank5 ; 20 4 if _Room = 54 && player1x > 77 && player1x < 90 && player1y < 40 then _Room = 64 : player1y = 84 : _Bit5_Frozen{5} = 0 : goto DS64 bank5 ; 21 6 if _Room = 59 && player1x > 84 && player1x < 101 && player1y > 59 && player1y < 76 then _Room = 23 : player1y = 84 : _Bit5_Frozen{5} = 0 : goto DS23 bank4 ; 22 0 mk2 dim room_index = temp1 dim target_bank = temp2 dim DS_target = temp3 if !ridat[_Room] then skip room_index = ridat[_Room]-1 if player1x < P1xlo[room_index] || player1x > P1xhi[room_index] then skip if player1y < P1ylo[room_index] || player1y > P1yhi[room_index] then skip _Bit5_Frozen{5} = 0 if newxdat[room_index] then player1x = newxdat[room_index] if newydat[room_index] then player1y = newydat[room_index] _Room = new_room[room_index] DS_target = DStdat[room_index] target_bank = tbnkdat[room_index] on target_bank goto bnk3 bnk4 bnk5 bnk6 skip bnk3 goto dispatch3 bnk4 goto dispatch4 bank4 bnk5 goto dispatch5 bank5 bnk6 goto dispatch6 bank6 ; 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 data newydat 85, 85, 84, 85, 18, 85, 84, 77, 84, 0, 84, 85, 85, 85, 85, 34, 84, 75, 75, 84, 84, 84 end data newxdat 0, 117, 0, 78, 0, 21, 0, 77, 0, 78, 0, 78, 46, 0, 0, 0, 25, 0, 0, 0, 0, 0 end data P1xlo 73, 67, 109, 45, 115, 63, 50, 81, 47, 88, 100, 52, 59, 89, 97, 125, 0, 33, 115, 72, 78, 85 end data P1xhi 84, 85, 117, 55, 133, 76, 69, 90, 65, 95, 112, 63, 77, 103, 105, 133, 255, 51, 133, 89, 89, 100 end data P1ylo 255, 46, 255, 255, 255, 53, 255, 56, 41, 61, 41, 255, 255, 255, 255, 29, 255, 255, 255, 255, 255, 60 end data P1yhi 54, 54, 64, 70, 24, 61, 23, 62, 45, 76, 46, 62, 61, 30, 61, 0, 54, 46, 46, 46, 39, 75 end data new_room 46, 42, 39, 27, 37, 40, 66, 31, 37, 25, 38, 26, 32, 34, 36, 7, 56, 48, 50, 51, 64, 23 end data DStdat 1, 0, 10, 3, 8, 11, 7, 4, 8, 1, 9, 2, 5, 6, 7, 0, 5, 2, 3, 4, 6, 0 end data tbnkdat 3, 3, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 2 end data ridat 0, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 0, 0, 9, 0, 10 0, 0, 11, 12, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0 14, 0, 0, 15, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 18 0, 0, 0, 19, 20, 0, 21, 0, 0, 0, 0, 22, 0, 0, 0, 0 end mk3 bank 4 dispatch4 on DS_target goto DS23 DS25 DS26 DS27 DS31 DS32 DS34 DS36 DS37 DS38 DS39 DS40 DS37 DS23 DS25 DS26 DS27 DS31 DS32 DS34 DS36 DS37 DS38 DS39 DS40 bank 5 dispatch5 on DS_target goto DS42 DS46 DS48 DS50 DS51 DS56 DS64 DS66 DS42 DS46 DS48 DS50 DS51 DS56 DS64 DS66 bank 6 dispatch6 asm echo (.mk2 - .mk1)d echo (.mk3 - .mk2)d end ***here is an explaination of the above code to understand it better. Should put this as a reply in the sword of surtr thread in case anyone else is interested. It's been a few months so I may not remember everything I spread out your if statements and put them in a more tabular form to make it easier to see the correspondence to the tables (the data statements) The tables are setup for rooms 0..59 There are 22 if statements and they are very similar. Each if statements corresponds to a particular room. You do 22 if tests to decide that you don't need to do any if tests and that's roughly 2/3 of the time (or at least for 2/3 of the possible rooms, not necessarily the same thing) Better to just look it up in a table of flags. Thats the ridat table. A zero flag means no if tests The 22 if statements are very similar so they get replaced by a single set of if statements that get passed parameters selected according to the room number The parameter tables could be indexed by the room number but then they'd be 2/3 empty (2/3 of the rooms dont need any parameters) So there's an entry in the parameter tables for each if statement and which set of parameters is looked up is in the ridat table according to the room (ie indexed by the room number) So the ridat is a set of flags. If the flag is 0 then no if statement. If the flag <>0 then it's the index into the parameter tables for that room (ridat = room index data) For speed and simplicity the no if test flag value is 0 but the parameter tables are 0 based so the value in the ridat table is the index + 1 There's a comment to the right of each if statement with two numbers. The first number is the value of that if statement's index into the parameter tables + 1 You could in principle get by with a bit for each flag ie 8 bytes instead of 60, but you'd still need to look up the index to the parameters That means that it is the ridat table that is basically 2/3 empty but not the parameter tables (you could think of it as a simple form of data compression). (actually more than 2/3 'cause you only need 5 bits for the flag/index data so even the bytes that are used are about 1/3 empty) You might be able to use that space for other stuff The if statements are similar but there are empty spots in the parameters tables (P1xlo, P1xhi, P1ylo, P1yhi) corresponding to tests not in the if statements Since the if predicate clauses are ANDed, and for a Boolean x && TRUE = x , those spots in the table have to always test true Except that I reversed the sense of the if statements so that they're ORed so that instead of always doing something if this AND that AND theOther are TRUE, you skip it if this OR that OR theOther is FALSE (Don't know if you actually tryed the code but if you do, best make sure I didn't screw that up ) There are also assignments made in the if statments (ie _Room, player1x, player1y), but not all of the if statments In the parameters (newxdat, newydat, new_room) a 0 means no assignment and a value<>0 gets assigned Bank switches take a lot of code so I parameterized them and reduced it to four actual bank switches in the code. That took four table look ups, two in to the parameter tables to get the indexes (tbnkdat, DStdat) into the tables implicit in the on goto statements (the other two table look ups are the on goto statements themselves) there's only ~20 or so possibilities so the parameter look ups could be fit in to one table/byte but the DSxx labels go up to DS68 or something, so I left room if I recall correctly the second number in the comments with the if statement is the index for the in bank dispatch on goto, ie DStdat/DStarget Quote Link to comment Share on other sites More sharing options...
ultima Posted December 24, 2018 Author Share Posted December 24, 2018 (edited) . Edited December 25, 2018 by ultima Quote Link to comment Share on other sites More sharing options...
ultima Posted December 24, 2018 Author Share Posted December 24, 2018 (edited) Starting work on a special Flashback Portable version Edited December 25, 2018 by ultima 1 Quote Link to comment Share on other sites More sharing options...
WizardBone Posted April 18, 2020 Share Posted April 18, 2020 I was searching for your game for awhile until I realized you renamed it! lol Is it finally done? I remember loving the project a couple years ago. 1 Quote Link to comment Share on other sites More sharing options...
ultima Posted October 16, 2020 Author Share Posted October 16, 2020 On 4/18/2020 at 10:02 AM, WizardBone said: I was searching for your game for awhile until I realized you renamed it! lol Is it finally done? I remember loving the project a couple years ago. Sorry for the late reply but yeah for better or worse this was the final. Although looking at it with fresh eyes I think I could have done a better job. Quote Link to comment Share on other sites More sharing options...
NostAlgae37 Posted October 18, 2020 Share Posted October 18, 2020 On 10/16/2020 at 12:13 AM, ultima said: Sorry for the late reply but yeah for better or worse this was the final. Although looking at it with fresh eyes I think I could have done a better job. I used to feel that way about essays and short stories that I would write when I was younger. Perfectionism is a harsh mistress, she eats away at you bit by bit until there is nothing left. It took awhile, but I eventually learned how to let it go. I was wondering though, have you considered making a 7800 version of this game like @Revontuli did with Dragon's Descent? It might make for an interesting opportunity for you to exorcise some of those "demons of regret" that are plaguing you at the moment. 4 Quote Link to comment Share on other sites More sharing options...
+Karl G Posted October 18, 2020 Share Posted October 18, 2020 Yeah, it's always easy to identify things you could have done differently/better after a project is complete, but it doesn't mean it wasn't still good. I'm still hoping to see this one on cart. 2 Quote Link to comment Share on other sites More sharing options...
slacker Posted October 20, 2020 Share Posted October 20, 2020 Just tried this one out for the first time today. I really enjoyed it! Very cool adventure game. The dragon gave me a bit of a run for my money but after a bit I was able to make it to the end. (On B difficulty) Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.