8000 Release Beta 4.10.0 · jakubg1/OpenSMCE · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Beta 4.10.0

Latest
Compare
Choose a tag to compare
@jakubg1 jakubg1 released this 07 May 20:31
· 19 commits to master since this release

As promised, today we're releasing Beta 4.10.0! This time we've got a lot of new powerups and changes to existing powerups in store, as well as Level Timers in a few variations and more!

Happy matching!

Changelog

Game Development

Changes in gameplay.json:

  • In the sphereBehavior section:
    • Added the following fields:
    • foulDestroySpheres - Specifies how the spheres will be destroyed when the level is failed.
      • Contains a type field, which can be one of the following:
        • "atEnd" - The spheres are destroyed at the end of the path. This matches the current behavior.
        • "fromEnd" - The spheres are destroyed starting at the frontmost one and going back the path, until all spheres are destroyed. Contains the following fields:
          • delay - The delay between losing and destroying the first sphere, in seconds.
          • subsequentDelay - The delay between destroying one sphere after another, in seconds.
    • cascadeScope - Specifies the scope of cascade combos. Can be one of the following:
      • "chain" - Default. All Sphere Chains will count their own cascade combo values independently from each other.
      • "path" - All Sphere Chains will count their cascade combo values in conjunction with each other on each path separately. This also matches the vanilla Luxor gameplay.
      • "level" - The cascade combo value is globalized and is shared between all paths, sphere chains and sphere groups.
    • distanceEvents - Optional. Specifies a list of Distance Events, which are Game Events that can trigger when any Sphere Group rolls past the specified point on its path.
    • Each Distance Event contains the following fields:
      • reference - Specifies the reference point of the Sphere Group which will be compared with. Either of "front" or "back".
      • distance - The Path distance (percentage from start) of the path to be compared to.
      • forwards - Optional. If set, the Game Event will be executed when the reference point rolls forwards past the set point.
      • backwards - Optional. If set, the Game Event will be executed when the reference point rolls backwards past the set point.
      • event - The Game Event which will be executed when all conditions of this Distance Event are satisfied. This can be only a path and cannot be inlined until gameplay.json is moved to Config Classes.
  • Added a new optional section: levelTimers.
    • Defines Level Timers.
    • The keys are the timer names, and the values are objects which define these timers.
    • All level timers are reset when the level is restarted or has been finished.
    • They have the following fields:
      • countDown - Optional. If set, the timer will be counting down and will cap at 0. Otherwise, the timer will be counting up.
      • value - Optional, defaults to 0. The starting value of this timer, in seconds.
  • Added a new optional section: levelTimerSeries.
    • Defines Level Timer Series. They can be helpful when tracking the frequency of events which happen over time, for example "make X cascades in Y seconds".
    • As Level Variables and Level Timers, they are reset once the level is restarted or finished.
    • The keys are the Timer Series' names.
    • Each entry is an empty object.
  • The lightningStorm section has been removed.

How to make Lightning Storms as of this version?

  1. Instead of the lightningStorm collectible effect type, use projectileStorm:
{
    "type": "projectileStorm",
    "projectile": "projectiles/lightning_storm.json",
    "count": 10,
    "delay": "${0.25 + random() * 0.1}"
}

You can reuse the delay and cancelWhenNoSpheresToDestroy fields here.
2. Configure the projectiles/lightning_storm.json projectile as follows:

{
    "$schema": "../../../schemas/projectile.json",
    "speed": 0,
    "sphereAlgorithm": "lightningStorm",
    "destroyParticle": "particles/lightning_beam.json",
    "destroySound": "sound_events/lightning_storm_destroy.json",
    "destroySphereSelector": "sphere_selectors/dagger.json",
    "destroyScoreEventPerSphere": "score_events/sphere.json"
}

Here, you can reuse the remaining fields from gameplay.json:

  • particle -> destroyParticle
  • sound -> destroySound
  • scoreEvent -> destroyScoreEventPerSphere
  1. If you haven't already, set up the sphere_selectors/dagger.json sphere selector as follows:
{
    "$schema": "../../../schemas/sphere_selector.json",
    "operations": [
        {
            "type": "addOne",
            "sphere": "${[redirectedHitSphere]}"
        }
    ]
}

Changes in Level data: config/levels/level_X.json

  • Added a new objective type:
    • "sphereChainsSpawned" - How many sphere trains need to spawn in order to complete this objective.
  • In the trainRules field:
    • In the "waves" type of level train rules, in the waves field, added a new element syntax:
      • Instead of "AAABBBCCCAABBCC", you can now write "3*3:ABC,3*2:ABC" and get for example:
        • "AAABBAACCCAACCC"
        • "CCBBBAAABBBCCBB"
        • "BBAACCCAAACCAAA"
      • This syntax is called a Train Preset Generator.
      • It consists of any number of blocks, separated by commas: x*y:ABC, where:
        • x - The amount of groups like this in the train.
        • y - The size of the group.
        • ABC - Any number (excluding zero) of keys defined in the key field which the generator will evaluate to.
      • The blocks are never going to generate with the same key next to each other.
      • Not every key is guaranteed to show up.
      • The preset generation can be tested with a new train command.
    • For the "random" and "pattern" types - directly inside the main field list, and for the "waves" type - inside the key definition, added a new optional field:
      • chainChances - A list of percentage probabilities for each of the chain levels for any sphere of that key to spawn with.
        • If one chance is rolled, the subsequent do not roll. For example, for the [0.25, 0.25] value:
          • 25% of spheres will spawn with one chain layer,
          • 18.75% (25% of the remaining 75%) of spheres will spawn with two chain layers,
          • The remaining 56.25% of spheres will spawn with no chain layers.
  • In path behavior:
    • Added a new speed node transition type: "instant".
      • Takes no parameters.
      • This means that node's speed will apply all the way to the next node.
    • Added new distance types:
      • offset - The offset from the start of the path, in pixels.
      • offsetFromEnd - The offset from the end of the path, in pixels.

Changes in Level Sequence data: level_sequences/*.json

  • Added a new Level Sequence entry type: "executeGameEvent".
    • Executes a Game Event.
    • Contains the following field:
      • gameEvent - The Game Event to be executed.

Changes in Collectible data: collectibles/*.json

  • Added new Collectible Effect types:
    • "projectileStorm" - Starts a storm of Projectiles.
      • Has the following fields:
        • projectile - The path to the Projectile which will be spawned.
        • count - The amount of the Projectiles which should be spawned. Can be an Expression.
        • delay - The delay between projectile spawns. Can be an Expression.
        • cancelWhenNoTargetsRemaining - Optional. If true, if a strike is wasted, the entire storm is cancelled. Otherwise, the projectiles continue to spawn regardless.
    • "collectibleRain" - Starts a rain of Collectibles falling from the top of the screen.
      • Has the following fields:
        • collectibleGenerator - The path to the Collectible Generator which will draw the Collectibles.
        • count - The amount of collectibles which will be spawned in total. Can be an Expression.
        • delay - The delay between powerup spawns. Can be an Expression.
    • "colorSort" - Starts a color sorting procedure for all Sphere Trains.
      • Has the following fields:
        • sortType - One of the following:
          • "instant" - The colors will be sorted instantly.
          • "bubble" - The colors will be sorted using the bubble sort.
        • delay - The delay between consecutive sorting steps, in seconds.
        • stopWhenTampered - If set, the sorting process will be halted when the sphere train is tampered with. Doesn't work yet.
  • Changed some Collectible Effect types:
    • For the "multiSphere" type:
      • The count field is now optional.
      • Added three new optional fields:
        • time - The amount of time the multi-spheres will be available for, in seconds.
        • removeWhenTimeOut - If set, the multi-spheres will be removed from the shooter when the time expires.
        • holdTimeRate - How fast should the multi-sphere timer go when the left mouse button is held. Works best with spheres which have the autofire property set to true.
    • For the "removeMultiSphere" type:
      • Added a new field:
        • removeSpheres - If set, the multi-spheres will be removed from the shooter.
    • For the "destroySpheres" type:
      • Added two new optional fields:
        • gameEvent - A Game Event which will be executed when the spheres are destroyed.
        • gameEventPerSphere - A Game Event which will be executed once per destroyed sphere.
  • Renamed the "setCombo" collectible effect type to "setStreak".
    • Its parameter has been renamed from combo to streak.
  • The lightningStorm Collectible Effect type has been removed.

NEW! Projectile data: projectiles/*.json

  • Projectiles are Meteor Storm-like entities, which target a particular sphere, spawn in a distance around it and strike, destroying spheres and executing a score event.
  • They can be set up to spawn exactly on top of the targeted sphere and activate instantly, which is the new and only way Lightning Storms will work.
  • The following fields are available for each Projectile:
    • particle - Optional. A persistent particle packet which will follow the projectile entity.
    • speed - The projectile speed in pixels per second.
    • spawnDistance - Optional. The distance from the target around which the projectile can spawn, in pixels.
      • If not set, the Projectile will instantly explode at its target.
    • spawnSound - Optional. The Sound Event which will be played when the projectile is spawned.
    • sphereAlgorithm - The algorithm which will determine the target sphere. Can be one of following:
      • "homingBugs" - The "homing bugs" algorithm will be used (largest groups first).
      • "lightningStorm" - The "lightning storm" algorithm will be used (smallest groups first).
    • homing - Optional. If set, the projectile will actively target its target.
    • destroyParticle - A one-time particle packet which will spawn when the projectile is destroyed.
    • destroySound - Optional. A sound event which will play when the projectile is destroyed.
    • destroySphereSelector - A sphere selector which wil determine which spheres should be destroyed.
    • destroyScoreEvent - Optional. A score event which will be executed when the spheres are destroyed.
    • destroyScoreEventPerSphere - Optional. A score event which will be executed for each destroyed sphere.
    • destroyGameEvent - Optional. A Game Event which will be executed when the spheres are destroyed.
    • destroyGameEventPerSphere - Optional. A Game Event which will be executed once per destroyed sphere.

Changes in Sphere data: config/spheres/sphere_X.json -> spheres/sphere_X.json

  • Spheres are now driven by Config Classes.
    • Their home folder is spheres and is the only valid directory where the sphere files can exist.
    • They require an appropriate $schema field to be detected: "$schema": "../../../schemas/sphere.json"
    • The sphere file naming scheme remains unchanged and only integer IDs are allowed.
      • The sphere ID 0 is still a special ID assigned to either a scarab or an empty slot, depending on context.
  • Spheres can now have a chain level, which defaults to 0.
    • When the chain level is above 0, if the sphere is going to be destroyed with a Sphere Effect, it will have one chain level removed, instead of the sphere completely destroyed. This behavior is not configurable yet.
    • Chains can be rendered on the Spheres using a sprite with a condition which uses the new [sphere.chainLevel] Expression Variable. Make sure to provide a default value like so: "${[sphere.chainLevel|0] == 1}".
      • Otherwise, the game will crash when trying to render the sphere in other contexts, such as the shooter!
  • Added new fields:
    • sprites - A list of sprite definitions which control the sphere rendering.
      • Each definition contains the following fields:
        • sprite - The sprite to be rendered as a part of this Sphere.
        • rotate - Optional. Defaults to true. If set, the sprite will be rotated depending on the path curvature.
        • animationSpeed - Optional. If specified, the sphere will not roll, and instead animate with the specified number of frames per second.
        • rollingSpeed - Optional, defaults to 2/pi. If set, the sprite will be rolling with that speed, in frames per pixel.
        • conditions - If specified, all conditions inside this list must pass, otherwise that particular sprite will not be rendered.
          • All [sphere.*] Expression Variables which do not require a position are available there.
    • autofire - Optional. If true, that particular sphere can be immediately shot when the left mouse button is held down.
    • holdParticle - Optional. A persistent particle packet used whenever the left mouse button is held.
    • shotCooldown - Optional. If set, the sphere will not be able to be shot once it enters the shooter's main slot before this amount of time in seconds passes. The sphere can still be swapped and when swapped back, the cooldown counter will start from the beginning.
    • destroyEvent - Optional. If specified, a Game Event will be executed for each sphere of this type destroyed.
    • chainDestroyParticle - Optional. A one-time Particle Packet which will spawn when a chain layer is stripped from the Sphere.
    • chainDestroySound - Optional. A Sound Event played when a chain layer is stripped from the Sphere.
  • Renamed a few fields:
    • shootBehavior -> shotBehavior
    • shootEffects -> shotEffects
    • shootSpeed -> shotSpeed
    • shootSound -> shotSound
    • interchangeable -> swappable
    • colorSpeed -> colorPaletteSpeed
  • The color field has been split into two, depending on whether it's a Color or Color Palette:
    • Use color for the Color.
    • Use colorPalette for the Color Palette.
    • Either one of these fields must exist.
  • The shadowSprite field no longer has a default value, and no shadow will be displayed if this field is not set.
    • To preserve current behavior, set this field to "sprites/game/ball_shadow.json" for all spheres.
  • In the shotBehavior section, added new optional fields:
    • For the "normal" type:
      • gameEvent - A Game Event which will be executed after the sphere has been launched.
    • For the "destroySpheres" type:
      • gameEvent - A Game Event which will be executed once for the whole batch of spheres.
      • gameEventPerSphere - A Game Event which will be executed separately for each Sphere that is destroyed.
  • The sprite, spriteAnimationSpeed and spriteRollingSpeed fields have been removed.

Changes in Sphere Effect data: sphere_effects/*.json

  • Added a new field: destroyChainedSpheres.
    • If set to true, the spheres affected with this Sphere Effect will be destroyed completely regardless of whether they are chained or not. Otherwise, if the affected spheres are chained, one chain layer will be removed instead.
  • Renamed the following fields:
    • canBoostCombo -> canBoostStreak
    • canBoostChain -> canBoostCascade
    • canKeepCombo -> canKeepCascade
  • The applyChainMultiplier has been removed as it was unused.

Changes in Sphere Selector data: sphere_selectors/*.json

  • Added new operation types:
    • "select" - Selects a percentage of spheres out of currently selected spheres.
      • Contains the following fields:
        • percentage - The percentage of spheres to be selected, from 0 to 1 (100%).
        • round - The rounding method if the resulting amount of spheres is fractional.
          • "up" - Round up.
          • "down" - Round down.
          • "nearest" - Round to the nearest integer.
    • "addOne" - Adds a specific sphere provided in the expression (most likely from a Variable Provider), instead of iterating through all spheres and performing an equality check on all of them.
      • Has the following field:
        • sphere - An Expression which must return a valid Sphere object to be returned by this Sphere Selector.

Changes in Shooter data: config/shooters/*.json

  • Added a new optional field: autofire.
    • If true, all spheres held by this shooter can be immediately shot when the left mouse button is held down.
  • The shootSpeed field has been renamed to shotSpeed.

Changes in Game Events: game_events/*.json

  • Added new Game Event types:
    • "single" - Executes a single Game Event.
      • event - The Game Event to be executed.
    • "scoreEvent" - Executes a Score Event.
      • scoreEvent - The Score Event to be executed.
    • "setLevelTimer" - Sets the value of the Level Timer.
      • timer - The ID of the Level Timer to be set.
      • time - Optional. The time to be set for this Level Timer. Defaults to 0.
    • "addToTimerSeries" - Adds a new entry to the Level Timer series.
      • This entry will live for a given amount of seconds.
      • After the time expires, the entry will be removed.
      • Timer Series entries do not contain any information.
      • Contains the following fields:
        • timerSeries - The name of the Level Timer Series to be added to.
        • time - The lifespan of the Level Timer Series entry.
    • "clearTimerSeries" - Removes all entries from the given Level Timer Series.
      • timerSeries - The name of the Level Timer Series to be cleared.

NEW! Sprite Atlas data: sprite_atlases/*.json

  • They internally combine a few Sprites together into one image, so that drawing different textures on the screen takes less drawcalls (i.e. is better optimized and faster).
    • Right now, they need to be explicitly defined in the game files.
      • At some point, they might be generated dynamically and automatically instead.
  • Their home folder is sprite_atlases/, their schema is "../../../schemas/sprite_atlas.json".
  • The data is as follows:
    • sprites - A list of Sprites which should be included in the Sprite Atlas.
  • Example file: sprite_atlases/spheres.json
    {
        "$schema": "../../../schemas/sprite_atlas.json",
        "sprites": [
            "sprites/game/ball_1.json",
            "sprites/game/ball_2.json",
            "sprites/game/ball_3.json",
            "sprites/game/ball_4.json",
            "sprites/game/ball_5.json",
            "sprites/game/ball_6.json",
            "sprites/game/ball_7.json",
            "sprites/game/vise.json",
            "sprites/game/ball_wild.json",
            "sprites/game/ball_fire.json",
            "sprites/game/ball_lightning.json",
            "sprites/game/ball_shadow.json"
        ]
    }
    
  • Not including this file in your game will severely tank the performance from now on, as the spheres are no longer batched together by default!

Changes in Expressions: (anywhere where supported)

  • The following Expression Variables have been added:
    • [color.totalSpheres] - Returns the total amount of spheres on the screen, excluding scarabs.
    • [level.accuracy] - Returns the current level accuracy, from 0 (0%) to 1 (100%).
    • [level.<timer_series_name>.length] - Returns the current amount of entries ticking down in the provided Level Timer Series.
    • [match.destroyedFragileSpheres] - true when the match contains a sphere which has just destroyed at least one sphere with an effect marked as fragile while it was a Shot Sphere, false otherwise.
    • [sphere.chainLevel] - Returns the chain level of the Sphere. Available wherever the sphere or hitSphere Expression Variable Contexts are present.
  • The [redirectedHitSphere.*] Variable Context has been changed:
    • Stone spheres now cannot be redirected at. Instead, the sphere redirection will first scan for an eligible sphere both to the front and to the back and will randomly pick one of the results. If no results are found (entire train uneligible) then something should happen, but definitely not a crash like right now.
  • The [color.mostFrequent] Variable has been removed.
    • Use the following Variable Provider instead:
    {
        "type": "mostFrequentColor",
        "sphereSelector": "sphere_selectors/everything.json",
        "fallback": 1,
        "framePersistence": true
    }
    
  • Most of the [sphere.*] Expression Variables are now available when the Sphere is rendered (for the conditions field in the sprite entry data).
  • The [level.combo] Expression Variable has been renamed to [level.streak].
  • The [selector.sphereCount] context variable will now be available for the per-sphere Score Events (and Game Events) as well.
  • The [hitSphere.*] Variable Context is available when a Projectile explodes and has either the homing property set to true or the spawnDistance property unset. That Context is the target sphere.

NEW! Variable Provider data: config/variable_providers.json

  • Variable Providers are quasi-functions, which can be used with Expressions. You can use them like Expression Variables.
  • In order to define them, you must create a config/variable_providers.json file. This is the only valid path.
  • The file contains the following fields:
    • providers - A list of providers, keyed by their names.
      There are 6 Variable Provider types:
      • "value" - For testing. Returns a constant value.
        • value - The integer value to be returned.
      • "countSpheres" - Returns the amount of spheres selected by the provided Sphere Selector.
        • sphereSelector - The sphere selector.
      • "mostFrequentColor" - Returns the most frequent color from the spheres selected by the provided Sphere Selector. Ties are randomized.
        • sphereSelector - The sphere selector.
        • fallback - What should be returned if the selector returns zero spheres. Can be an Expression.
      • "randomSpawnableColor" - Returns one of the colors that can spawn in the current level.
        • excludedColors - Optional. A list of colors which will never be returned.
      • "redirectSphere" - Redirects the provided sphere and returns the result. Redirection scans until it finds the closest eligible sphere both forward and backward, and returns a random result out of them.
        • sphere - An Expression which must return a Sphere object which will be the search origin, e.g. "${[hitSphere.sphere]}".
        • sphereSelector - A Sphere Selector. All selected spheres are eligible, i.e. can be returned.
      • "redirectSphereColor" - Similar to "redirectSphere", but returns the redirected sphere's color. Has an advantage: if no eligible spheres to redirect to are found, the fallback color can be provided.
        • sphere - As above.
        • sphereSelector - As above.
        • fallback - What should be returned if the selector returns zero spheres. Can be an Expression.
          All Variable Provider types support the following optional field:
      • framePersistence - If set, this Provider will be evaluated at most once per frame, with subsequent calls in the same frame returning the same value.

Changes in UI Script: ui/script.lua

  • Renamed the following API functions:
    • levelGetCombo -> levelGetStreak
    • levelGetMaxCombo -> levelGetMaxStreak
    • levelGetMaxChain -> levelGetMaxCascade
  • The comboEnded callback has been renamed to cascadeEnded.

Gameplay

  • Changed Luxor and Luxor Amun Rising to better match the original game:
    • Reduced decceleration for Slow and Stop powerups from 200 to 100.
    • Cascades (Chains) are now shared between different sphere trains on the same path.
  • Fixed accuracy counting.
    • A multishot sphere will now count as however many spheres have been actually shot, instead of 1.
    • Each shot sphere is now permitted to bump the successful shot counter only once, even if it pierces through multiple spheres.
  • Adding or infecting a sphere in a group with an immobile Sphere Effect will now instantly grind that group to halt instead of it slowing down gradually.
  • The fragile spheres will be now also destroyed when they are moved by appending a sphere behind in the group.
  • Reduced usage of the Vector2 class, which should reduce stuttering and improve performance especially when lots of Spheres or Particles are on the screen.
    • The work will continue for the next release.

Boot Screen, Debug and Console

  • Changed the list of funny messages when using the crash command.
  • Absence of the assets/eggs_crash.txt file will no longer abruptly close the application after using the crash command.
  • When a crash happens, regardless of whether it was caused intentionally or not, there's a 1% chance for an easter egg to show up. :)
  • The F7 debug key has been removed.
  • The F3 debug key now shows more things (including what F7 was showing before).
  • A new option has been added to the Boot Screen: "Print deprecation notices".
    • This setting is intended for developers.
    • When it is enabled, the ingame console will show code deprecation messages along with a pointer to the relevant line of code.
    • Setting up a deprecation notice is as easy as adding a _Debug:deprecationNotice() call in the relevant chunk of code. In a few places, this call has been added.
    • Duplicate messages are never shown.
  • Improved some error messages.
  • Added a test train command.
    • Usage: train <preset>
    • Prints the generated preset, similarly to what Sphere Chains do when generating the trains.
    • The logic is copied, which makes the command obsolete once changes are made to the logic in the Sphere Chain class.
    • At some point, the logic will be extracted.
  • The test suite can be launched by starting the engine with the -t argument.
    • The test suite is unavailable in fused mode (cannot be launched from within an executable).
    • You must download and launch the engine directly from the source code instead.
    • It turns out test mode works fine in a fused executable! Yay!

Bugfixes

  • Fixed a crash related to stone spheres and delayed match effects.
    • When the match effect had a delay and the match with stone spheres on either side has been interrupted (more spheres added in the middle) in the meantime, the game would crash after the match has been made.
  • Fixed a crash when a Sphere Effect was infecting nearby spheres without a defined applySound.
  • Gap information is now properly cleared when the sphere is appended into the train.
  • The shooter cooldown is now saved.
0