ZC [2.future] Development Plans [To-Do]
This is a separate topic, detailing things that we plan to do, or that we would like to do/add into 2.xx in the future. users are welcome to respond to this, but we'd like to keep feature requests, and bug reports in their own threads.
Italic listings are partially done.
Bold listings are implemented, but untested.
Green Italic are partially implemented to the point of being test-able.
Green Bold are done, and working.
Red Italic are likely impractical.
Red Bold are ruled as impossible, or abandoned.
Blue are ruled as extremely difficult, but potentially possible, or at least plausible.
Note that while this is a list of what we would like to accomplish, there is absolutely no guarantee that we will do all of what you see here!
ZScript
ZScript::Lexer, Parser, Stack
- Expand the number of gf registers to a large amount.
- Allow exporting the entire buffer, with all included text in-line, on compilation as a master output.
- Add some mathematical things, and logical operators.( !<, !>, ^^, NAND, NOR).
- Read/set any ZC Interface options (e.g. FPS, Uncapped, MenuOpen) by script.
- Fix scoping issues that cause variables declared in statements (and in the run() function) from being (improperly) pre-allocated.
- Add some directives.
- Increase the script buffer from ~18MB to MAX_LONG in bytes.
- Add additional routines for handling of strings. : Some implementation of string literals is done.
- Add 2D and 3D arrays.
- Add special datatypes, and declarations.
- Allow global datatype pointers/declarations. This involves preallocating some for this use, similar to arrays.
- Increase array operational pointers from 4096 to *.
- Increase other operational pointers for datatype objects from 255 to *.
- Add extra preprocessing support.
- Add some lexer symbols, such as ? (question-mark) to be used in function names, such as ?InAir()
- Add function pointers.
- Add custom defined datastructs.
- Add a few additional types for variables. : I was originally thinking of adding byte, char, long.
- Fix error messages to be more useful.
- Detect some common errors, such as reading an invalid pointer ( e.g. LoadNPC(0) ) during compilation.
- Include support for linked lists and hash tables internally.
- Add new typedefs that would be useful. : Grayswandir added typedef.
- Add new tokens, such as switch, case, and the like. : Added switch-case; still need define and enum.
- Add new directives, such as #DEFINE
- Add octal NUMBERS
- Expand IDENTIFIER to cover more (useful) symbols.
- Add user-defined pointers.
- Add user-defined objects.
- Add new types, especially those used by AngelScript.
- Add compile-time option to 'Export ZScript Code as AngelScript.
--> This would work as 'Export ZScript code to ZASM' does now, and would create a file with the code as AngelScript. This is a 2.60 or 2.65 goal. - Add 'Cross-Compile to AngelScript' output option.
- Add token defs for standard var declarations in both cases.
- Add AngelScript style and token, and or token.
- Add Until() and Unless() expressions.
- Add Repeat(int iterations) loop type.
- Add 'load' directive to load a quest with a specified file name into the present save slot, and change the assigned quest when loading that slot.
- This is for serialised quests spanning multiple quest files.
ZScript::Global
- Add returns to detect if a screen is a dungeon, or other type, based on its DMap.
- Read any DMap value.
- Pretty much make any value read/write.
- Add Subscreen namespace,and allow easy subscreen construction.
- Allow datatype typecasting for objects.
- Fix problem reading the pointer of a boolean array.
- Read UIDs to use as pointer refs. useful for finding a specific part of a segmented enemy.
- Add functions to directly modify the palette, or tiles on a pixel-basis, or colour basis, including reading tiles for a colour value.
- Add internal global array series as easy to use defaults.
- Internalised Remove() : This should not be too terrible.
- Add internal Collision() ZScript function. : Partially done.
- Add additional weapon generation functions. : Added CreateLWeaponDx(int type, int origItem)
- Set/change quest rules by script.
- Allow setting an array size with numeric literal equations (e.g. 14+16) or constants.
- Allow loading any LSet or ESP, or CSet pal, into a normal CSet pal, or changing CSet values by script.
- Allow reading most internal variables, including enemy timers, and whatnot.
- Return engine properties as boolean flags; or make returns for uncapped(), and MenuOpen(), and CheatMenu(). : This will not be permitted in ZC Canonical.
- Return ZQuest version in which a quest was created as a global int. : I added a way to get the current ZC Version.
- Add method of reading system time, and date.
- This would allow setting time, or events in a quest, based on real-time events.
- Add PrintToLog(char str) to ZScript.
- This would print the contents of 'str' directly to the log, without needing to declare a ZScript string. : The new string literals handle this with TraceS().
ZScript::itemdata
Nearly Done
- Add all editor values, including Attributes[10], and ensure that all item data resources, and itemdata resources cross over, including Sound, Cost, Level, and so forth. 99% done.
- itemdata values at present don't include about 80% of item attributes.
e.g. The values for a Peril Ring, only allow modifying its Power, but not its min_hearts. We can solve this by ensuring that all attributes are available (read/write, while we're at it). : Done. - Allow custom itemclass definitions, and arguments via Attributes[10]
- Make all values read/write. : Should be done for itemdata.
ZScript:Objects
- Get UIDS of all objects.
- Use UIDs as references.
- Store the script id that spawns a weapon, ffc or npc with it. : The new messaging system should permit this.
- Add a NoRemove boolean to all objects, so that if they are off-screen, they are not removed when this is set.
- All object types should have 'bool ObeysGravity'.
ZScript::*weapon
- Allow easy crossing of all itemdata values. This is to allow making a weapon by reading the itemdata values of any existing item, or npcdata (see below).
- Correct bomb and flag interaction with wLitBomb and wBOOM for scripted explosions, possibly adding LW_EXPLOSION as its own weapon type. : THis is much harder than it seemed at first. I did add CreateLWeaponDx() which properly reads the sprite from a bomb item when making an explosion. (It reads Sprites[0] from any item.
(!) Added CreateLWeaponDx(), which forwards datum from a specified item to use its sprites, and sounds for LW types that do not have such properties, such as LW_PBOMBBLAST. - Add bool ObeysGravity to all weapons.
ZScript::npc
- Add Defences[] for all ten script types. (added as npc->ScriptDefense[10])
- Ensure that all values are r/w.
- Allow creation of custom npc classes (with attributes defined by script).
- Add npc weapon attributes to match all values available to *weapon, so that the user may set them.
This includes, for example., npc->WeaponSound, npc->WeaponPower, npc->WeaponSprite, and the like. - Give components of a segmented enemy unique flags, and allow access to them individually.
- Add user-defined movement styles.
- Replace(npc n) to change one npc for another, without needing to silently kill one, and spawn another.
- Add ->Invincible attribute. Read to see if an npc is invincible, or set true to make it invincible. (i.e. guy::superman)
- Allow reading, and writing to npc lists anywhere in the game environment.
- Modify CanWalk() so that it checks if the npc's Step has changed since the last frame. In fact, it needs to do the following:
- Do a CanWalk(), store Stepin LastStep. If LastStep differs, recheck.
- We need some re-check before committing the walk movement, in the event that a user writes to Step.
- At present, Step is not rechecked, and if a user writes to it, during the phase at which an npc begins moving, the npc can walk into solid tiles.
ZScript::npcdata
- We plan to add this, to operate as itemdata for nocs, so that you can read npc values without creating them, and waiting for them to spawn.
- Dynamically modify main npc attributes, such as walk type.
ZScript::Link
- Add Walkspeed attribute as a variable.
- Diagonal movement, Big Hitbox, and Extend by ZScript.
- Make all values r/w
- Add Link->Extend, so that all the Link hitbox, and drawoffset, and similar things work.
- Allow setting Link->Tile
- Finish defining some of the missing Link->Action types.
- Allow pre-waitdraw adjustments to Link variables that do not work at present.
- Make all values r/w.
- Add shield block flags to cover all script types.
- Add some ->Action types
- Add Z3 sword class.
- Add a flagset to indicate button presses, and inputs.
- Add ->Invincible attribute. Read to see if Link is invincible, or set true to make him invincible. (e.g. superman, not CollDetection; or as a special circumstance that ignores some collision?)
(!) Added Link->Invincible, which uses his invincibility frames.
- Allow setting Link's equipment.
ZScript::Screen
- Increase Screen->D[] regs to 256. (not happening, because of memory usage).
- Add function to SetScreenBoundary() s that scrolling occurs when the player passes its event horizon, instead of the default screen edge. This would allow for different screen sizes.
- Display passive subscreen, set by flag, or script.
- Read/set any screen flag by script.
- Read npc lists from any screen in the game.
- Add TriggerSecret(int specific_secret) -- This will require making secrets into a flagset on the ZScript side.
- Detect screen changes and add a timer to determine how long it has been since the screen changed.
ZScript::Script Drawing
- Add additional routines for bitmap handling, including translucent rendering to screen.
- Increase bitmap area to a very large size (possibly for advanced panning, or scrolling)
- Add missing drawing functions, such as Polygon() and Polygon3d()
- Allow setting a bitmap as a texture to a drawn object.
- Allow creating user-defined bitmaps with user-defined IDs at specific sizes.
- Allow saving user bitmaps directly in the quest file.
ZScript::ffc
- Complete solidity flag, and allow it to be used with multiple types.
- Add solidity bounds as variables.
ZQuest Editor
Editor::Enemies
- Add editor flags for various npc options, including invisibility (by type) and reveal invis (by item).
- Add block flags by specific script type.
- Add death sprite, and other death effects.
- Move hardcoded enemy effects to user-defined attributes.
- Add 'Invisible', 'Cloaked', Item Class Reveals Insivible [ field ], Item Reveals Invisible [ field ], Itemclass Reveals Cloaked [ field ], Item reveals cloaked [ field ] to the ditor.
--> This would allow the user to specify if an enemy is cloaked, or invisible, and set up a specific item, or itemclass to reveal them. - Add 'Lens Reveals Invisible', 'Lens Reveals Cloaked', 'Amulet Reveals Invisible', and 'Amulet Reveals Cloaked' to each enemy as checkboxes. These work in addition to the specified classes, and items (above).
- Add 'Splits into enemy (ID, number of enemies) on hit', Splits into (enemy ID, number of enemies) fields to every enemy.
- [B]Add all ten script defence types as individual settings.
->Generic 'Script' would continue to work for any type. (THe old 'Script' value is forwarded to the new ten at present.) - Add 'Split' as a defence outcome. This means that the enemy will split into its defined split variety when hurt by the specified weapon type.
- Add 'Whistle' defence type. Make Digdogger's Whislte Defence 'Split'
- Add 'Double Damage' as a defence outcome.
- Add combo type 'Sideview Ladder'
- Add combo type 'Pit (Damage)' with different heart damage values and falling LTMs. This should make a sound, set LA_FALLING, and send Link back to the spot at which he entered the screen.
- Add combo type 'Lava/Fire' with damage values. This should make a sound and send Link back to the spot at which he entered the screen.
- Add Link->Action LA_ONFIRE
- Add Link->Action LA_FALLING
- Add Link Variable FireDamage
- Fix LA_SPINNING so that it does the spin animation on demand.
- Fix LA_CHARGING so that it always displays a charging animation.
- Fix LA_CASTING so that it always displays a casting animation.
- Add Link var ChargingItem so that we can set what item Link is holding out.
- Maybe ChargingSprite?
- Add Link->Useitem(int itm). This will use an item even of it isn't in an A/B slot.
- Add Link->SetItemA/B internally, instead of the std.zh pressDirand subscreen madness. This will set an item to A/B directly. It should have a param 'bool force' that sets it even if Link doesn't have it.
- Add way of detecting what item Link is using.
- Add Link->EquippedItems. When gaining an item, this is set true by default, but can be disabled/enabled without needing to set owning the item to false to temp orarily disable it, or allow equip menus/subscreens.
- Add Link variable FireDuration. This should be reduced by 1 per frame, internally.
- Add Link->Input and Link->Press flagsets.
Editor::Items
- Add 'Can Pick up Items [ field: list item numbers, separated by commas ]' to allow the item to pick up anything listed that it touches.
- Add 'Deliver items picked up on contact' and 'deliver items picked up when weapon returns to Link' as options for delivery.
- Allow setting the Misc Attributes for generic class items as [ text fields ] instead of greyed out pulldowns.
Editor::Rules & Quest Settings
- Add duplicate point to set Link movement and related attributes rules in QRs panel, in addition to the Link->Graphics panel.
- Expand the amount of the text field for quest details in header.
- Add 'Quest credits' to quest header.
- Enable visibility of 'Quest Number', rather than needing to press a special key to view, and set it.
Editor::Other
- Add flag editor.
- Add font editor.
- Enhance subscreen editor to support multiple pages, and other action types (equip/unequip)
- Add option to use specific script object (weapon, or otherwise) in editor options that use them.
- Allow setting any pulldown value to a custom value (with field for entry). For example, npc and item values.
- Add additional user-defined flags, for use with flag editor.
- Add SCCs for more robust options, and to complete some partially-implemented things.
- Allow more than 8 script args for editor panes.
- Display passive subscreen as a separate option from show subscreen in editor pane.
- Allow setting subscreen display by DMap, instead of by specific screen.
- Allow any screen flag to be set for all screens on a given DMap from one editor pane.
- Add quest templates, with pre-loaded tiles, scripts (enemy, bods, engine, items), for 'Z3-esque', Gameboy-esque', and 'RPG'.
--> These could probably use a *.cgf file to set that, and whatnot, that is read into a buffer. We could then present it in its own GUI window, where a user may toggle settings, and when a user changes (and commits) anything, ZQ would automatically (and silently) recompile using the .cgf file through an import directive in the main buffer.
--> pretty much, when the user saves changes, the save is written to the *.cfg file, and then the main buffer (with a call to import "questtemplate*.cfg" is recompiled, and all slots automatically reassigned, without displaying any of the manual parts of compiling.
--> This is so that the user never needs to look at the scripts directly.
--> Essentially a new 'Classic/Z1' quest would be what we use now, but the other options would load a quest template with all of the things needed to make that style of quest, pre-configured.
17-Jan-2017 : Updated