Jump to content

Joshua Bone

  • Content Count

  • Joined

  • Last visited

  • Days Won


Everything posted by Joshua Bone

  1. As soon as I wrote this, I realized the solution to the read-only Gameboard problem. I plan to make a ReadOnlyGameboard interface, which Gameboard will implement. This interface will expose only the methods which do not mutate the Gameboard state. Then the GraphicsManager will get the gameboard as a ReadOnlyGameboard.
  2. Ah, summer. Our weekends are packed. Last weekend was a Saturday mountain climbing adventure + a Sunday Father's Day celebration. This weekend is a massively compressed trip to Alaska to tour Denali National Park and go whitewater rafting. Next weekend is a 4-day trip to Indiana. And so forth. The Unity project has not been forgotten. On the contrary almost every free moment during my weekday evenings has been going into designing and building the class infrastructure which will either make or break the project. I've been spending a lot of time on how to ensure a clear separation of concerns. Here's what I have so far. Gameboard The Gameboard class is the stage on which the action takes place. The Gameboard object gets instructions on how to set itself up initially from some type of Level object. So far, it only reads CC1Level objects, which are parsed from DAT files. In the future I plan for it to be able to set itself up from CC2Level classes which will be parsed from C2M files, and eventually a 3rd level format which we have yet to define. Gameboard objects include the time and chips counters, global states for toggles and tanks, the current replay sequence, etc. They also contain a 2D array of MapCell objects which are defined later in this post. The most important rule here is that "A Gameboard is not a Level". This means: You don't save Gameboard state (even for checkpoints I'm hoping to load the level up from starting position and then use a replay to get back to current state). You don't modify Gameboard objects from any level editor. You modify Level objects, which are instructions for how to set up a Gameboard. You don't reuse Gameboard objects. It would be error-prone to try to reset each stateful field. Instead, actions like level restart or checkpoint reload should always set a new Gameboard up from scratch. Engine Classes that implement the Engine interface contain a set of rules for how to modify/mutate the Gameboard object. The Engine interface defines a single method: void call(Inputs inputs); It is expected that normal gameplay will call this method at 60 times per second (to accommodate CC2 electricity at a later date), with the Engine incrementing a tick variable internally and filtering out ticks as needed to achieve movement ticks at the desired rate. IMPORTANT: The Engine and everything below it (Gameboard, MapCell, Element, Level, etc) are intended to be written in pure C#, without any reference to Unity-based classes. In theory this means that the C# code is fully decoupled from the Unity platform, which could allow a couple of advanced concepts: Running a server that handles levels/levelsets/ratings/high scores/replays, which could potentially validate replays by running the game engine server-side. Running a server that handles the gameplay serverside, and sends graphics updates to a browser-based implementation. (this seems far-fetched, but it's a cool idea). MapCell The MapCell contains all the elements that are at a given x-y coordinate on the Gameboard. As described on the Discord server, the MapCell is a hashmap. The keys are the Layer enum (Terrain, TerrainPlus, Static, Pickup, Creature), and the values are the object at the given layer. This allows for two important things: A single object can occupy more than one layer (e.g. the green toggle bomb, which needs to occupy the Pickup layer as a green chip, but the Static layer as a green bomb.) Adding new layers (thin walls, canopies, electricity) requires minimal code changes. The MapCell is smart enough to deduplicate such items when returning its contents for processing Enter/Exit rules. Elements All Elements inherit from the Elem class. The Elem class is abstract and contains a lot of useful default code, mostly related to 3 concepts: CalcMove actions. These are typically the standard testEnter, testExit, startEnter, and startExit methods that determine whether an ICreature object can enter or exit the given element. PostMove actions. These are typically the standard finishEnter and finishExit methods that determine what happens on move completion. For MS-like engines, the PostMove actions will occur immediately after the CalcMove actions, while for Lynx-like engines, they may occur 1 or more movement ticks later. Occupies rules. These are the layers in the MapCell (almost always just one) that an element occupies. All moveable elements currently implement the ICreature interface (name subject to change). I'm still figuring out how this should work with the Engine for processing movement logic. GraphicsManager This class has read-only access to the Gameboard. (Honestly, my code isn't clean enough yet to ensure it doesn't have write access also, but that must never, ever happen! I think the answer is to use the internal keyword for methods that mutate the Gameboard, such that the Engine has access but the GraphicsManager does not.) The graphics manager reads in the contents of the Gameboard (within the viewing window) and builds/reuses and positions Unity GameObject classes. These classes contain the bitmaps and animations needed to view the game window. InputManager Reads user input and supplies it to the Engine at 60Hz. GUIManager Handles the layout of the screen including text boxes, inventory, positioning of the game window, menus, and navigation. Next Steps My immediate goal is to get CCLP1 levels working with just 5 elements (Floor, Wall, Player, Chip, Exit). All other elements will be processed as a NotImplementedElement and behave as acting floors or something.
  3. Good idea. We may get there eventually. For now the #community-projects and #programming channels in CCZone are the main places for discussion.
  4. So, I hadn't meant to let it slip quite yet that I'm in the early stages of working on a CC-like game which will eventually (hopefully on the scale of a few months) become an open source community project. I mean, we're talking very early stages. So far I can read in CC1 levelsets and convert them into an in-memory format. And there's a sweet random number generator. That's not much. That being said, however, I've spent thousands of hours working on stuff like this (Puzzle Studio in particular), and I'm pretty confident that this project will go somewhere. The project is unnamed so far. Every name so far doesn't seem to fit. It's not Super Tile World or Tile World 3 because Tile World is an emulation of Chip's Challenge, and this project has no intent of emulating a ruleset, but rather inventing a new one based on the best parts of old engines. It's not JBone's Challenge because I want this to be a community effort, and JBone's Challenge is really a different game I want to write (and which may eventually be branched from this). So it's just The Project or The Unity Project for now, name suggestions welcome. Is the Unity Project open source? The Unity Project is meant to be a community effort. I intend to release all of the C# code under an open source license of some sort, probably either the MIT or a Creative Commons license. HOWEVER, I have a set of criteria (Phase 1) that I want the project to meet before I open source it: The game has a new experimental ruleset which has received positive feedback from a large number of community members, particularly from the optimizer crowd. The game can open and play any Lynx-compatible CC1 levelset. All official levels in CCLP1, CCLXP2, CCLP3, and CCLP4 are solvable or at least are expected to be solvable (I'm certainly not going to solve all of them!) in the new ruleset. Depending on the engine it may be possible to apply an algorithm to the public TWS files to generate replays in the new engine, and then manually test the levels where that strategy doesn't work. The game uses a forward-thinking internal level format for things like button connections, global toggle state, level size, viewing window, controls, etc. which is expected to accommodate most of the CC2 gameplay. (I would like to be able to open CC2 files and use many of the elements, but I have no intention of ensuring that all CC2 levels are solvable under the new engine. The game has a robust testing framework. Unit tests for single elements (e.g. assert Player.testEnter(Wall) == false) Integration tests for as many gameplay situations as we can think of (e.g. make a 3x3 level with force floors, assert that after input "URDL" the player is on square X). Replay tests for a significant number of CCLP levels (e.g. if I apply this series of inputs to this level, gamestate == WIN_LEVEL). Why the emphasis on backwards compatibility? Lots of reasons! Might sound silly, but here's one of the biggest for me: We don't have to design a level editor until we get the core gameplay down!!! This is HUGE! I've probably started a half-dozen CC clones in my life, and none of them got very far. Part of the reason is I didn't become a software engineer until 2 years ago. But time and time again the part that I've gotten bogged down on is how to create a freaking editor and save and load my files. If we start by loading DAT files, we have tons of gameplay testing right out of the box. We don't have to decide on a save file format yet. Tons of world-class content available immediately for new people. Maximize engagement from existing community members. Level designers stay connected to their creations Familiarity of existing levels and gameplay. Spending time on CCLP5 submissions vs working on this doesn't have to be either/or. Best chance of moving future community level pack design efforts away from the two-ruleset tyranny. By setting clear definitions about what features the core gameplay must support, it allows the project to begin on a strong software engineering foundation, with a clear initial direction. How can I help during Phase 1? Get involved in the discussions. I'm going to have a lot of questions about things like boosting, spring step, trap behavior, etc. I'm trying to take the best parts of MS but I haven't spent a lot of time playing it. Even though the code isn't open source I do intend to share parts of it that I'm working on for feedback. Start learning C#. Unity tutorials will help a little bit, but I'm really just using Unity for the easy graphics and the cross platform support. Make animated game artwork! Make sound effects! Start designing the new features and tiles you want to implement. It's one thing to say we want lasers, it's another to specify what they will do and exactly how they should interact with other tiles. Playtest and aggressively look for bugs (as soon as there is something to playtest). Keep asking for progress and showing support. This is 100x more likely to happen if the community stays enthusiastic!
  5. Added an old Create Comp level 'HOW TO ITEM DROP LIKE A CHAMP' to "Last Minute CC2LP2 Submissions".
  6. Submitting NOEN CHEOC, a new level uploaded to the set "Last Minute CC2LP2 Submissions". Per Chipster suggestion, also submitting the following levels from CC2Rejects: Open, Sesame Railroad Sabotage Terrorism Parallel Dimension Trail Mix Road Block Pollution Triple Play Tank Crossing Glacier Facility Against Your Will HSM Titanic Glacier 2 Dumbell Insanity It Takes Two Cannon Fodder Chip's Blunder
  7. Version 1.0.2


    A place for last-minute CC2LP2 submissions. One level so far.
  8. Per a request from Mobius, I submit the level THAT FIGURES from CC2Rejects
  9. I submit all levels in Walls of Chip's Challenge 1.4.0 except for MULTICHIP, which is busted. I also submit EXTRACTION and OPTIMAZE from JBoneMisfits 1.0.0.
  10. Thanks for the feedback, I'll definitely update the time limit on The Golden Key.
  11. And then I had to go and design DUNGEON QUEST I agree with this point, but also think there are plenty of creative and non-violent ideas for tools that can destroy/remove monsters. I agree I wouldn't want Chip to have a sword or a gun or anything like that, but I think TNT and bowling balls are awesome, and it might be nice to have standard cherry bombs that were droppable. Lasers turrets would be awesome too. Or a 'freeze' gun.
  12. False--nothing is worth waiting a year and a half for. What really happens inside a transmogrifier?
  13. I reorganized the level order in 1.4.0 to be loosely based on increasing difficulty rather than original level order, so that's intended :). Thanks for the feedback too, very helpful as always. The walkers areas on SALMON RUN were designed to require basically no dodging skill to solve, coming as late in the level as they do. I actually was just looking to fill space at that point after a really complicated level. I played through the level again recently just to make sure and I still feel like they are fairly placed. My rule of thumb (usually, but not always followed) is that 'gratuitous' late-game dodging and puzzles on long levels should be solvable close to 100% of the time on the first try by an average player. In this case it should be obvious what needs to be done in both rooms, and it should be almost trivial to execute. If that's not the experience I'd love to hear what makes them difficult. ONE LESS'N BEFORE is nothing glitchy, just standard CC mechanics plus a single well-known CC2 ability. FF behavior in the Steam engine makes it a little tricky to execute, but I can pull it off almost every try. I think altering player position and editor peeks in general fall into the same category. Ultimately it's up to the player how they want to experience the game. Some levels could be absolutely ruined by this; in others, it's a harmless way to get past a single difficult section. I don't mind it. On MY MOTHER SAYS the rest of the level after the opening puzzle was honestly pretty much just filler. Glad to know it's enjoyable filler :). The opening puzzle is surprisingly hard, and was one of those 'I wonder if this is possible' designs that turned into a puzzle that seems to fit the space perfectly.
  14. No prob! It'll be nice if the community can build up a library of useful things like this that can then be used for interesting level designs, so it's not a matter of trying to figure everything out from scratch.
  15. I personally don't believe that creativity lessens with age; however I do believe that it lessens when I'm not prioritizing it. Like anything else, the longer you go without using it, the less of it you have. Look at the lives of many great artists, composers, and poets, and you see that many of them complete their masterpieces late in life. I highly recommend the book "The Artists' Way" by Julia Cameron if you're feeling blocked, it has a lot of creative exercises which both my wife and I have found especially useful over the years.
  16. SET/RESET: The outer four buttons can be 'set' independently, and the middle button resets them all. SEPARATE ON/OFF: A simpler version of SET/RESET. Basically like a toggle switch except the on and off functions are separated. MULTI-TOGGLE: You can add more branches as needed. Each press of the button moves the toggle to the next state. EDGE TRIGGERS: The STEP ON trigger fires a 1-tick pulse on tick t+1 after the button is pressed. The STEP OFF trigger fires a 1-tick pulse on tick t+3 after the button is released. The ROCKER fires either a 1-tick or 2-tick pulse on tick t+1 after the button is pressed, and another 1-tick or 2-tick pulse on tick t+1 after the button is released (the pulse will be 1-tick wide for a short press of the button, and 2-ticks wide for a long press).
  17. Thanks, guys! _H_: I am hearing you on the time limits. You've given this feedback on quite a few levels and I will try to reevaluate each level individually for the next version. I agree CONQUEST is a prime candidate for an untimed level. The noise on MY MOTHER SAYS is just one example of one of the big weaknesses of CC2 -- the horrible SFX. I play with the sound turned way down. I've already decided not to alter my design process based on worrying about annoying sounds. Didn't realize there was guesswork on THE AMAZING VORTEX, I will take another look. A MAN OF MANY LAYERS is my least favorite of the new levels; I was stuck on ideas for those walls for a while. Maze levels in general have been the big holdups for this set. If I think of another idea I'll change it in a heartbeat. Thanks for the feedback on the rest mobius: I try to keep the levels that use glitches and unexpected behavior small. I think they're definitely fair game for bonuses, but agree they can spoil a level if abused. Other than MULTICHIP, I'd be interested to hear if you think there are other obvious examples. I guess I'd say that THIN BLUE LINE and SPIRIT PORTAL might be borderline as well. On PART AND PARCEL, would you agree with _H_ that the left side would be better without the invisible walls? RULE OF TINCTURE was just a result of my usual indecision on what to name a variety level. I think I started with the word 'grail' and did some googling/wikipedia searching to look for other medieval sounding names. I think I like the result. Glad you liked the others! I also was pleasantly surprised by I MOVE YOU MOVE. I didn't want the level to lose its character from SLO MO but also felt like ditching the toggle walls wouldn't leave anything recognizable. It's not the highlight of the set or anything but it felt playable at least. I've been feeling ambivalent about SLIMEYARD, but am glad you enjoyed it!
  18. Thanks! CONQUEST is what it is, I think it might be possible to expand the starting areas a little bit, but I think it's legit to have a couple of campaign levels in the set. I'm definitely switching my focus to easy levels now. On OBFUSCATED, I intended it to be a 'misdirection' level, where if you do the one 'obvious' option all the way through you end up stuck, sort of like on DETECTIVE STORY but with more noise. The fact that it felt linear with one option at each point makes me feel like it might be busted. Dunno, I haven't really looked at it in a year or so.
  19. Thanks for the feedback (9 months later). I would be very interested to know what your solution was for OBFUSCATED AND INTERRED. If you ever feel like recording a video I'd love to see if it is busted
  20. Version 1.4.0


    The remodeling of the Clubhouse is halfway complete! -Contains 76 levels all based on the layout of classic Chip's Challenge puzzles. -New since version 1.3.0: Reordered levels to create an approximate difficulty curve (still a work in progress... I need to make more easy levels!) Recorded and saved replays of all levels Added 10 levels: MARKTKANAAL (replaces CENTRAAL STATION), CONQUEST, MY MOTHER SAYS, DISINTEGRATOR INTEGRATOR, HOOPLA, SALMON RUN, THE AMAZING VORTEX, A MAN OF MANY LAYERS, NURSERY GAMES, GREENLIGHT Updated TELEBLAST to prevent cooking the level by pushing a block over the exit or by moving the teleports out of reverse reading order. Renamed FIGHTING FIRE WITH ICE to FIREFIGHTER and moved placement of buttons to fix an annoying bug. Made STACKS much easier by replacing chips with bonus flags along the edges of the bug room. Replaced beginning puzzle of SLIDESHOW SIDESHOW with a much harder and more interesting puzzle. Added two blue doors to make the endgame of TANTALIZING BARRIERS easier; the original solution is still possible and scores bonuses. Made FOOTRACE THROUGH FIRE SWAMP much easier, put more emphasis on the `footrace' and less on the other puzzles. Renamed ERRBODY GOT PROBLEMS to TWELVE BAR BLUES. Added speed boots to FAVORABLE DISTRIBUTION. Removed most of the icy corridors from DOWNTOWN HESITATION to make walkers much less deadly. If you try nothing else, at least check out: The opening puzzle on MY MOTHER SAYS. DISINTEGRATOR INTEGRATOR (basically IN & OUT 3) MARKTKANAAL Feedback is most appreciated!
  • Create New...