Author SHA1 Message Date
Furo e540cb454b Changes project.xml to project.hxp 2025-10-20 20:17:45 +02:00
Ralty 8506619465 Make it a StateEvent with current subState 2025-10-16 20:39:48 +07:00
ItsLJcoolandGitHub 3469524d8c implement onCloseSubState (#789)
Seriously, why havent this been added alongside with onOpenSubstate
2025-10-16 20:23:31 +07:00
CareandGitHub 90e0e5618d Use different functionality for CameraBop if useCamZoomMult is off (#792) 2025-10-16 20:01:53 +07:00
Ralty 7a9edf809c Redo 95b4d888f0 2025-10-05 14:09:12 +07:00
Ralty 7719fd6a10 Revert "Push unique event to Event List Once (#785)"
This reverts commit 95b4d888f0.
2025-10-05 14:07:24 +07:00
LasyandGitHub 95b4d888f0 Push unique event to Event List Once (#785)
* Update EventsData.hx

* Update EventsData.hx again
2025-10-05 09:51:50 +07:00
Ralty f5dde710e3 I forgot 2025-10-04 11:54:39 +07:00
Ralty 3220a2e360 Fix PauseSubstate Scripts Music Crash & postCreate 2025-10-04 11:07:59 +07:00
86839ac6b3 Fix MOD_ICON's misleading config comments (#759)
* Fix MOD_ICON's misleading config comments

* lowercase folder stuff and fix grammar

* Update ModConfigWarning.hx

---------

Co-authored-by: Ralty <78720179+Raltyro@users.noreply.github.com>
2025-10-04 10:53:17 +07:00
dba8200854 Fix playAnim (#781)
* playanim if it was good

* dont mind me

---------

Co-authored-by: ⍚~Nex <87421482+NexIsDumb@users.noreply.github.com>
2025-10-04 10:43:32 +07:00
Ralty a296b33c0f Add postUpdate & onCameraMove to Character Scripts 2025-10-04 10:26:51 +07:00
Frakits a3498ce32b replace hardcoded vals for stage characters 2025-10-02 18:27:34 +03:00
FrakitsandGitHub d358724fd2 Update Script.hx 2025-09-25 16:13:22 +03:00
CareandGitHub 4ffd164fd2 add flags to default imports (#782) 2025-09-25 15:28:11 +03:00
M1 AetherandGitHub b87c206d45 Fix Icon anim/transition offsets (#747) 2025-09-24 12:44:07 +02:00
⍚~Nex 0f8354415e caught me off guard lmao 2025-09-23 21:32:11 +02:00
⍚~Nex 0251fe87bb making stages easier to be properly destroyed 2025-09-21 21:43:57 +02:00
⍚~NexandGitHub b7c932f9a9 changing these to fit properly the license
resolves #538
2025-09-21 18:42:40 +02:00
Karim AkraandGitHub 11b86c389c Don't use resetSprite as a static extension (#748) 2025-09-21 18:14:47 +02:00
2b66d74b01 Add default font customization flags for FunkinText (#762)
* Add default font customization flags for FunkinText

* dont mind me

* organizing these and deleting duplicates

* oh wait oops

---------

Co-authored-by: ⍚~Nex <87421482+NexIsDumb@users.noreply.github.com>
2025-09-21 17:35:27 +02:00
3b8859120f Use sh alternatives and fix change directory in building shell scripts (#769)
* Use sh alternatives and fix change directory in building shell scripts

The usage of the cd command in the shell scripts under building/ can
conflict at some point during the procedure. As far as I'm aware, it's
supposed to cd to the parent directory, but it does so strangely. On
some occasions, this may cause the directory to switch to /tmp
on Linux instead. This commit resolves that by instead using the
typical .. syntax, which is a shorthand for the parent directory of the
process.

Additionally, proper shebangs have been added that instead use
"/usr/bin/env sh", which returns the path to a suitable sh alternative:
that is, the closest program that can be found using 'sh' in the name.
This is one of the most recommended shebangs for a shell script, due
to 'env' typically being in the exact same position.

* Update cd in building shell scripts to use script relative path properly

The two prior versions would use the working directory's own parent
directory, not the script's. This commit simply makes it so that
changing the directory in the script uses its directory's parent instead.

* dont mind me

---------

Co-authored-by: ⍚~Nex <87421482+NexIsDumb@users.noreply.github.com>
2025-09-21 17:19:09 +02:00
bacd218e0b Improved Tankman Run Script + HScript Warning (#773)
* Improved Tankman Run Script +  HScript Warning

Updated the tankman run custom class and implemented the hscript warning system

* dont mind me

---------

Co-authored-by: ⍚~Nex <87421482+NexIsDumb@users.noreply.github.com>
2025-09-21 17:11:22 +02:00
b2049e6285 Improvement to the playAnim function (#776)
* Improvement to the playAnim function

* dont mind me

---------

Co-authored-by: ⍚~Nex <87421482+NexIsDumb@users.noreply.github.com>
2025-09-21 17:06:29 +02:00
⍚~Nex 6612fa6205 added ICON_DEFAULT_SCALE to Flags 2025-09-21 16:48:41 +02:00
⍚~NexandGitHub 5d63442626 opa 2025-09-16 03:55:36 +02:00
⍚~NexandGitHub 2b77d2820c oops x2 2025-09-16 02:32:46 +02:00
⍚~NexandGitHub 071f651d0b im not pushing it 2025-09-16 01:45:46 +02:00
⍚~Nex 079fda42fb bruh 2025-09-16 01:40:26 +02:00
⍚~Nex 96aac150f0 lets try 2025-09-16 01:34:14 +02:00
⍚~Nex fa135df33d finally doing this 2025-09-16 01:19:43 +02:00
⍚~NexandGitHub ed8a9c6390 bruh leftover 2025-09-11 01:15:12 +02:00
rufiusandGitHub 282fa0376d Add Nix shell configuration for compiling using Nix (#760)
* Add Nix shell configuration for compiling using Nix

This adds a Nix development shell configuration for using the Nix
package manager. Please see the pull request with this commit attached
for more information on how exactly it works.

* Add name attribute to shell
2025-09-08 20:04:53 +02:00
Jamextreme140andGitHub 3dbb22667b Update HScript.hx (#765) 2025-09-08 19:50:29 +02:00
⍚~Nex 9a2751733e fixing destroy in global having no static anymore 2025-09-04 14:51:47 +02:00
KolzeandGitHub 734b13904e fixed character editor anim bug that happened when adding a new anim (#757)
* fixed character editor anim bug

* forgor to change one variable
2025-08-27 21:20:31 +02:00
Jamextreme140andGitHub 0803e82e58 Not Include "Sys" on non-sys targets (#758) 2025-08-27 21:17:11 +02:00
💜 Rodney, An Imaginative Furball 💙andGitHub 2d6b85365b Update PlayState.hx (#742) 2025-08-27 04:48:44 +07:00
356607f53a Clear Static Vars Map on Mod Switch (#740)
* Update MainState.hx

* using clear()

---------

Co-authored-by: ⍚~Nex <87421482+NexIsDumb@users.noreply.github.com>
2025-08-24 02:10:55 +02:00
f9402fe826 cam movement keybind quanted & added a local keybind (#739)
* cam movement keybind quanted & local keybind

* Update Charter.hx

* changes that furo requested

* some edits

* opposite so its more consistent

---------

Co-authored-by: ⍚~Nex <87421482+NexIsDumb@users.noreply.github.com>
2025-08-24 02:01:28 +02:00
⍚~NexandGitHub be1657884e adding more stuff for auto building releases
mobile coding is hell
its the only thing i can use though while being on vacation sob
i dont wanna stay for too long without doing shits
2025-08-24 01:26:20 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
e862d72d71 Bump dawidd6/action-download-artifact from 2 to 6 in /.github/workflows (#750)
Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 2 to 6.
- [Release notes](https://github.com/dawidd6/action-download-artifact/releases)
- [Commits](https://github.com/dawidd6/action-download-artifact/compare/v2...v6)

---
updated-dependencies:
- dependency-name: dawidd6/action-download-artifact
  dependency-version: '6'
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-18 19:31:03 +02:00
BetopiaandGitHub 43e6aac281 fix meta loading in Chart.parse or idk what should i call this (#741)
an argument was missing.. i think
2025-08-18 12:23:51 +02:00
Furo 157e209f31 Fix Release Bundling 2025-08-18 11:55:33 +02:00
Furo b8fef83ef1 Release Maker workflow 2025-08-18 11:28:25 +02:00
Hero 283929b1a2 leaving this here. 2025-08-18 02:08:21 +03:00
Furo 000546e9ff Xml, Type, Date, Lambda and Sys are default imports for hscript 2025-08-17 20:45:06 +02:00
Furo 7df13ec012 Fix Bookmarks Z-Index and Scrollbar Position (on creation) 2025-08-17 13:07:17 +02:00
BittoandGitHub 68a5dd2482 [LANG] Add Portuguese (#703) 2025-08-10 22:54:51 +02:00
⍚~NexandGitHub 4f834169f3 specifyin
its better trust me sob
2025-08-10 22:23:46 +02:00
SrtHero278 689eda7114 alphabet editor stuff
i still need a way to add spritesheets
2025-08-10 11:32:36 -07:00
FuroandGitHub 9757b002bd 1.0.1 (no more rc) 2025-08-10 14:28:33 +03:00
Ralty 3140ee8512 Account variation to last freeplay play too 2025-08-10 17:26:51 +07:00
FuroandGitHub c96ee6c465 Use FunkinModchart Static Commit 2025-08-10 13:05:43 +03:00
TheZoroForce240andGitHub 1c4c962f4d Add Funkin Modchart classes to hscript config to allow custom classes (#727)
* add funkin modchart to hscript config for custom classes

* change to only classes that are needed
2025-08-10 12:59:20 +03:00
Ralty 49d4708265 Fix Freeplay Last Saved Thingies 2025-08-10 13:47:45 +07:00
Ralty ffa5e66bc8 These should be in debug too... 2025-08-10 13:03:36 +07:00
Ralty 18fcacc2b5 I forgot 2025-08-10 12:51:26 +07:00
Ralty a2ff5c112e Band-aid Fix for psych charts 2025-08-10 12:50:05 +07:00
Ralty 3862995213 fix auto needsVoices 2025-08-10 09:06:37 +07:00
Ralty f7e4875097 h 2025-08-10 08:56:43 +07:00
Ralty cabdffd058 color too 2025-08-10 08:55:52 +07:00
Ralty c28e056a8a oh my god 2025-08-10 08:36:54 +07:00
Ralty 3fd87c8d52 Dont force set chart name 2025-08-10 08:34:57 +07:00
Ralty eaacc5dfc2 Variation face should be parent face 2025-08-10 08:30:38 +07:00
Ralty 4573fef74d Remove this trace 2025-08-10 08:28:31 +07:00
Ralty 978022dc0b Fix VSliceParser crash 2025-08-10 08:25:52 +07:00
Ralty 970d294ea1 Didnt i fixed this before 2025-08-10 07:52:57 +07:00
Ralty 7568cbfd99 songVariations -> variants 2025-08-10 07:42:45 +07:00
Ralty c5686b09db Fix Chart Saving in assets/assets if no path found 2025-08-10 07:41:12 +07:00
Ralty ce4d1a0d61 V-Slice should have needsVoices false if no voices 2025-08-10 07:40:57 +07:00
Ralty 2eac58aaa5 fpsLerpTo should use getFPSRatio 2025-08-10 07:03:43 +07:00
Ralty ce98ad0645 aaghh 2025-08-10 05:41:32 +07:00
Ralty 037f564676 forgor 2025-08-10 05:17:10 +07:00
Ralty 5227ed3253 Fix Freeplay Autoplay 2025-08-10 05:16:27 +07:00
Ralty 9e4b6f31c0 Bring back difficulty metas for now 2025-08-10 05:16:16 +07:00
Ralty fe02ba7b4b Hold Subdivisions should be in control by modders 2025-08-09 20:15:11 +07:00
Ralty ec63be9e77 Fix backward comp issues and freeplay 2025-08-09 20:00:49 +07:00
Ralty 88ea51064b This one too 2025-08-09 19:56:10 +07:00
Ralty 647c70839d Furo requested 2025-08-09 18:57:44 +07:00
Ralty 39237dd01d Fix creating variation & VSliceParser 2025-08-09 17:52:18 +07:00
Ralty d3bd40baf3 Seperate global events for variations 2025-08-09 16:40:57 +07:00
Ralty 7d7db50c19 Fix Variation Editor Crash 2025-08-09 15:54:03 +07:00
Ralty 8aa2023057 cancellable onSongEnd 2025-08-09 15:43:04 +07:00
d979b5c33d (attempt to) make icons more constantly sized between menus (#644)
Co-authored-by: Ralty <78720179+Raltyro@users.noreply.github.com>
2025-08-09 15:21:14 +07:00
theoandGitHub ba50edfc99 Add modcharting features (using FunkinModchart) (#526)
Technically already in the codes but yeah
2025-08-09 15:13:19 +07:00
Ralty 5acabccd9a Fix pixel icons in CharterStrumline 2025-08-09 14:55:11 +07:00
Ralty 66c1cd9dde Fix compiling error 2025-08-09 14:42:07 +07:00
Ralty ec65cae8fc Fix Charter Strumlines length not updating 2025-08-09 14:42:01 +07:00
Ralty 3de652c73e Merge Options XML crash fix PR 2025-08-09 14:31:18 +07:00
Ralty 8303e7ecfd Whoops 2025-08-09 14:24:56 +07:00
Ralty e17b5d6b86 Fix audio calling complete callbacks twice 2025-08-09 13:41:05 +07:00
Ralty 0ff829e1c6 Replace meta difficulties with variations. 2025-08-09 13:32:49 +07:00
rufiusandGitHub 769a33f138 Fix incorrect translation identifiers during stage creation (#721) 2025-08-09 09:27:48 +03:00
Ralty 91abb37281 Fix 2025-08-09 13:23:02 +07:00
Ralty 32bca0420e Change storyPlaylist, backward comp in loadSong 2025-08-09 13:22:53 +07:00
Ralty faa0dbb324 CharterSelection Song Variations 2025-08-09 12:16:58 +07:00
Ralty 14c81ef26d Merge branch 'main' into repurpose-variants 2025-08-09 05:53:36 +07:00
Ralty 62f4819493 Use previous difficulty if possible 2025-08-09 05:53:29 +07:00
Ralty 8ba41990e6 UpdateUtil hopefully doesnt show null this time 2025-08-09 05:47:40 +07:00
Ralty 6c92fcff8b Fix Window Title if no MOD_NAME presents 2025-08-09 05:47:27 +07:00
Ralty 6a802c2281 Song Variations Ordering 2025-08-09 05:40:03 +07:00
FuroandGitHub 3a6f4819a9 1.0.1-rc2 2025-08-08 22:41:20 +03:00
FuroandGitHub e24a62a0b7 macOS executable path is different 2025-08-08 21:17:58 +03:00
Ralty 9c7bb8f073 Aghhh variant, variation, whatever 2025-08-09 00:31:45 +07:00
Ralty 6112e2f759 Changed FunkinSave Highscores Implementation 2025-08-08 22:20:54 +07:00
Ralty 3939439086 Chart Variations Backend Implementation 2025-08-08 20:50:12 +07:00
Ralty 59b54dfbae Fix WINDOW_TITLE_USE_MOD_NAME 2025-08-08 19:06:22 +07:00
Ralty a83f62ab8a Merge remote-tracking branch 'upstream/main' 2025-08-08 18:11:01 +07:00
Frakits f86773223b Merge remote-tracking branch 'origin/main' 2025-08-08 13:57:25 +03:00
Frakits b1133171c7 Merge remote-tracking branch 'origin/main' 2025-08-08 13:57:16 +03:00
Ralty 05006802ee Bring back needsVoices, add vocalsSuffix in meta 2025-08-08 17:54:39 +07:00
Frakits 0eaffe3ea9 you may now disable the updater. 2025-08-08 13:51:35 +03:00
Verwex 03df52c542 flipX and flipY for alphabet XMLs 2025-08-08 12:34:30 +02:00
Verwex 1ca4b64402 Translatable Mod Config Warning
The Translation Strings Used in Editors.xml:
- editor.notNow
- editor.yes
- modConfigWarning.warningTitle
- modConfigWarning.warningDesc
- modConfigWarning.createdTitle
- modConfigWarning.createdDesc

Only English & Polish variants are provided beacuse I speak those.
2025-08-08 11:10:25 +02:00
FrakitsandGitHub b8b8d08be5 Update issue templates 2025-08-08 11:43:28 +03:00
FrakitsandGitHub 406f76af5d improve lagspike? 2025-08-07 23:38:31 +03:00
Verwex 1a855e5061 Freeplay Change Mode Keybind
The Co-Op Mode Switch has been given its own keybind, approved by Frakits.

FOR TRANSLATORS:
The translation string in Options.xml is category.ui.changeMode
2025-08-07 21:13:37 +02:00
FrakitsandGitHub 41474738c7 Update Chart.hx 2025-08-07 21:07:33 +03:00
Ralty bcbfa90f37 Fix Freeplay Difficulty Inst Suffix 2025-08-08 00:38:03 +07:00
Ralty b39f0d993e Whoops 2025-08-08 00:25:23 +07:00
Ralty 65839283e5 Quick fix crash freeplay 2025-08-08 00:19:01 +07:00
Ralty d2a113907a instSuffix, meta.metas for freeplay preview 2025-08-08 00:07:49 +07:00
Ralty d3ef27b9c7 ChartData no longer needs needsVoices (pun) 2025-08-07 23:18:43 +07:00
Ralty 90fc02c128 Oh thats why 2025-08-07 22:43:27 +07:00
Ralty cbaa5a6155 Don't resync Inst too in resyncVocals, stupid 2025-08-07 22:32:30 +07:00
Ralty 1f479a5b16 fix beatHit twice during start 2025-08-07 22:29:44 +07:00
Ralty 967bd4cf01 An attempt to fix stutters for low-end computers 2025-08-07 22:23:45 +07:00
Ralty 3074107322 Async Checking for Updates 2025-08-07 21:54:59 +07:00
Ralty 9c7cc22a47 An attempt to fix skipping the next song randomly 2025-08-07 20:01:23 +07:00
Ralty 7c8dd987dd Fix __readStream out of bound 2025-08-07 20:00:12 +07:00
Verwex 48624554cd Merge branch 'main' of https://github.com/CodenameCrew/CodenameEngine 2025-08-07 13:55:32 +02:00
Verwex a86749953f Camera Position & Camera Zoom Event Icons 2025-08-07 13:55:11 +02:00
KolzeandGitHub 482c213079 prevent crash when vocal suffix doesnt exist (#709)
pls merge adding erects is hell
2025-08-07 14:42:57 +03:00
Verwex 8d8e6e453a Separated volume keybind labels for translations 2025-08-07 13:32:31 +02:00
TilandGitHub d6937e866c fix a buncha stuff in saveSongInfo for SongCreationScreen (#704) 2025-08-07 18:27:08 +07:00
Verwex 9ce1486269 PL Translation - Credits Btn - Kolze's Suggestion 2025-08-07 13:18:04 +02:00
Verwex 44a19340a4 PL Translation - Freeplay btn - Kolze's suggestion 2025-08-07 12:54:07 +02:00
rufiusandGitHub 74d37f60f3 fix a few README links to minimize redirects (#698) 2025-08-07 12:50:35 +03:00
Frakits f5b79bb332 Merge remote-tracking branch 'origin/main' 2025-08-07 12:49:48 +03:00
Frakits dbc3a79e62 begin the grandiose release. 2025-08-07 12:49:41 +03:00
FuroandGitHub a262b7e683 Fix some strings that werent showing (#707) 2025-08-07 12:43:47 +03:00
Frakits b43221d527 remove traces 2025-08-07 12:34:06 +03:00
Frakits 7a9a510c47 got the auto-updater working and removed russian translations 2025-08-07 12:32:04 +03:00
Frakits 1716dc48ab oh yeah i almost forgot 2025-08-07 11:03:50 +03:00
Frakits 522256a3cf ok whatever 2025-08-07 10:50:54 +03:00
Frakits 4e3d5d75ec Merge remote-tracking branch 'origin/main' 2025-08-07 10:45:13 +03:00
Frakits 3196195790 remove traces 2025-08-07 10:45:03 +03:00
Verwex e08fac35d0 Story Menu assets for the Polish Translation 2025-08-07 00:27:13 +02:00
Verwex 69f67ce3f9 Merge branch 'main' of https://github.com/CodenameCrew/CodenameEngine 2025-08-07 00:26:04 +02:00
Ralty d961fcec30 Fix WINDOW_TITLE_USE_MOD_NAME 2025-08-07 05:21:36 +07:00
Ralty de41464364 Fix Window Mod TItle, Icon 2025-08-07 05:17:06 +07:00
Ralty 75cc052c7b Fix Icon transition only appliying to atlas? 2025-08-07 04:58:32 +07:00
Verwex 991a168686 Merge branch 'main' of https://github.com/CodenameCrew/CodenameEngine 2025-08-06 23:32:03 +02:00
FrakitsandGitHub 1cdaf62088 fix translation fail 2025-08-07 00:17:55 +03:00
Frakits 537883d2f4 FIXED!! 2025-08-06 23:38:46 +03:00
Frakits 6a1bbb72e3 warning: this crashes (on linux) 2025-08-06 23:15:53 +03:00
Verwex 8b43664327 main menu buttons for the Polish translation 2025-08-06 20:56:14 +02:00
Verwex d1fa0e5fa7 Merge branch 'main' of https://github.com/CodenameCrew/CodenameEngine 2025-08-06 17:48:38 +02:00
FrakitsandGitHub e89c0411c6 Update UIUtil.hx 2025-08-06 18:04:12 +03:00
Ralty 1993d205ca Camera Bop 2025-08-06 21:06:28 +07:00
Ralty f8aa7201c0 camGameZoomMult, camHudZoomMult 2025-08-06 19:22:26 +07:00
Verwex 07086b5e38 Title Enter text for the Polish translation 2025-08-06 14:16:37 +02:00
Ralty 70195051ec Zoom Multiplier for camZooming 2025-08-06 17:51:13 +07:00
Ralty 9570de76a8 Fix week7-balledLines 2025-08-06 05:14:33 +07:00
Ralty 17539a6f39 Add cancelConductorUpdate, deathStart 2025-08-06 05:13:17 +07:00
Ralty 16b080bf84 Fix crashes on unseekable or pure empty vorbis files 2025-08-06 04:54:25 +07:00
Ralty 549c1ad441 ACTUALLY FIX THE EVENTS 2025-08-06 02:37:46 +07:00
Ralty be812cd2ec Fix unstacked chart events 2025-08-06 02:26:29 +07:00
Ralty 272f862c69 Attempt to fix linux not loading songs? 2025-08-05 18:23:58 +07:00
Ralty cf5a689918 u got to be kidding me 2025-08-05 05:22:04 +07:00
Ralty 84c153d69c fix WarningState not booting in ModConfigWarning 2025-08-05 05:18:36 +07:00
148 changed files with 3685 additions and 1111 deletions
+5 -1
View File
@@ -33,4 +33,8 @@ f8b20774e3f035eeddb9211a28a391b20db74456
# Revert a revert (empty script)
392416e00cbd82e1c49e82a9fafdcf2e069a654e
159467de832a172681200c463d244a46e295c3c8
159467de832a172681200c463d244a46e295c3c8
# Revert a revert (scripted cutscene path)
d73f86d26ec2dbf031c01f588ba4be11842db09c
fe0ab0aa454f4ae12ced9502db8a01e7bca3e04c
+3 -2
View File
@@ -5,9 +5,10 @@
pages/** linguist-vendored
# Include HScript files as Haxe
*.hxs linguist-language=Haxe
*.hsc linguist-language=Haxe
*.hscript linguist-language=Haxe
*.hsc linguist-language=Haxe
*.hxs linguist-language=Haxe
*.hxp linguist-language=Haxe
# Include Shader files as GLSL
*.frag linguist-language=GLSL
+8 -2
View File
@@ -2,12 +2,18 @@
name: Bug Report
about: Report a bug or critical performance issue
title: 'Bug Report: [DESCRIBE YOUR BUG IN DETAIL HERE]'
labels: bug
labels: ''
assignees: ''
---
[weed]: <> (MAKE SURE THAT THE ISSUE IS AS COMPLETE AS POSSIBLE. ISSUES THAT HAVE BARELY ANY INFORMATION OR IS ONLY MADE FOR TROLLING WILL BE INSTANTLY CLOSED.)
[weed]: <> (MAKE SURE TO ADD YOUR TARGET OR IT'LL BE IGNORED!)
### What version of the engine are you using?
[weed]: <> (IF YOU COMPILED THE ENGINE PLEASE PROVIDE A COMMIT HASH THAT WE CAN BASE OFF OF)
Version:
### Which target are you using?
[weed]: <> (CHANGE [ ] TO [x] IN FRONT OF YOUR TARGET!)
@@ -17,4 +23,4 @@ labels: bug
### Explain your issue
##### Please check first if your issue haven't already been reported yet.
[weed]: <> (MAKE SURE TO ADD A SCREENSHOT OF THE CRASH HANDLER, IF AVAILABLE, AND STEPS TO REPRODUCE THE BUG!)
[weed]: <> (MAKE SURE TO ADD A SCREENSHOT OF THE CRASH HANDLER, IF AVAILABLE, AND STEPS TO REPRODUCE THE BUG!)
+5 -2
View File
@@ -1,8 +1,11 @@
---
name: Compiling help
about: If you need help compiling the game, and you're running into issues. (Look through the 'compiling help' label in case it's been solved!)
about: If you need help compiling the game, and you're running into issues. (Look
through the 'compiling help' label in case it's been solved!)
title: 'Compiling help: [BRIEF DESCRIPTION / ERROR MESSAGE OUTPUT]'
labels: compiling help
labels: ''
assignees: ''
---
[weed]: <> (MAKE SURE THAT THE ISSUE IS AS COMPLETE AS POSSIBLE. ISSUES THAT HAVE BARELY ANY INFORMATION OR IS ONLY MADE FOR TROLLING WILL BE INSTANTLY CLOSED.)
+4 -1
View File
@@ -2,7 +2,10 @@
name: Enhancement
about: Suggest a new feature
title: 'Enhancement: '
labels: enhancement
labels: ''
assignees: ''
---
#### Please check for duplicates or similar issues before creating this issue.
## What is your suggestion, and why should it be implemented?
+2 -2
View File
@@ -12,9 +12,9 @@ jobs:
- name: Pulling the source
uses: actions/checkout@v2
- name: Setting up Haxe
uses: krdlab/setup-haxe@v1
uses: krdlab/setup-haxe@v2
with:
haxe-version: 4.2.5
haxe-version: 4.3.7
- name: Restore existing build cache for faster compilation
uses: actions/cache@v3
with:
+3 -3
View File
@@ -12,9 +12,9 @@ jobs:
- name: Pulling the new commit
uses: actions/checkout@v2
- name: Setting up Haxe
uses: krdlab/setup-haxe@v1
uses: krdlab/setup-haxe@v2
with:
haxe-version: 4.2.5
haxe-version: 4.3.7
- name: Restore existing build cache for faster compilation
uses: actions/cache@v3
with:
@@ -38,7 +38,7 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: Codename Engine (Executable Only)
path: export/release/macos/bin/CodenameEngine
path: export/release/macos/bin/CodenameEngine.app/Contents/MacOS/CodenameEngine
- name: Uploading artifact (entire build)
uses: actions/upload-artifact@v4
with:
+197
View File
@@ -0,0 +1,197 @@
name: Create Release Builds
on:
workflow_dispatch:
inputs:
tag_name:
description: "Release name (e.g. v1.0.5 or v1.2-rc1)"
required: true
prerelease:
description: "Is this a prerelease?"
required: true
type: boolean
custom_message:
description: "Optional pre-changelog message"
required: false
jobs:
collect-release:
name: Release ${{ github.event.inputs.tag_name }} Builds
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download Windows Full Build
uses: dawidd6/action-download-artifact@v6
with:
workflow: windows.yml
name: Codename Engine
path: artifacts/windows/full_build
allow_forks: false
- name: Download Windows Executable
uses: dawidd6/action-download-artifact@v6
with:
workflow: windows.yml
name: Codename Engine (Executable Only)
path: artifacts/windows/executable
allow_forks: false
- name: Download Mac OS Full Build
uses: dawidd6/action-download-artifact@v6
with:
workflow: macos.yml
name: Codename Engine
path: artifacts/macos/full_build
allow_forks: false
- name: Download Mac OS Executable
uses: dawidd6/action-download-artifact@v6
with:
workflow: macos.yml
name: Codename Engine (Executable Only)
path: artifacts/macos/executable
allow_forks: false
- name: Download Linux Full Build
uses: dawidd6/action-download-artifact@v6
with:
workflow: linux.yml
name: Codename Engine
path: artifacts/linux/full_build
allow_forks: false
- name: Download Linux Executable
uses: dawidd6/action-download-artifact@v6
with:
workflow: linux.yml
name: Codename Engine (Executable Only)
path: artifacts/linux/executable
allow_forks: false
- name: Prepare artifacts
run: |
mkdir -p renamed
# Windows
mv artifacts/windows/executable/CodenameEngine.exe renamed/update-windows.exe
cd artifacts/windows/full_build
zip -r ../../../renamed/"Codename Engine-Windows.zip" *
cd -
# Mac OS
mv artifacts/macos/executable/CodenameEngine renamed/update-mac
cd artifacts/macos/full_build
if [ -f CodenameEngine.tar.gz ]; then
# Keep tar.gz as-is
cp CodenameEngine.tar.gz ../../../renamed/"Codename Engine-Mac.tar.gz"
else
# Zip contents at root
zip -r ../../../renamed/"Codename Engine-Mac.zip" *
fi
cd -
# Linux
mv artifacts/linux/executable/CodenameEngine renamed/update-linux
cd artifacts/linux/full_build
zip -r ../../../renamed/"Codename Engine-Linux.zip" *
cd -
- name: Find Base Release
id: get_base_release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
echo "Looking for base release..."
PRERELEASE="${{ github.event.inputs.prerelease }}"
if [[ "$PRERELEASE" == "true" ]]; then
BASE=$(gh release list --repo ${{ github.repository }} --json tagName,isPrerelease,isDraft \
-L 50 -q '.[] | select(.isPrerelease==false and .isDraft==false) | .tagName' | head -n 1)
if [ -z "$BASE" ]; then
echo "No stable release found, resorting to prereleases."
BASE=$(gh release list --repo ${{ github.repository }} --json tagName,isDraft \
-L 1 -q '.[] | select(.isDraft==false) | .tagName')
fi
else
BASE=$(gh release list --repo ${{ github.repository }} --json tagName,isPrerelease,isDraft \
-L 50 -q '.[] | select(.isPrerelease==false and .isDraft==false) | .tagName' | head -n 1)
fi
if [ -z "$BASE" ]; then
echo "No older release found; please make sure to have at least one older release containing the 'update-assets.zip' file in order to generate the differences."
exit 1
else
echo "Base release: $BASE"
echo "base_release=$BASE" >> $GITHUB_OUTPUT
fi
- name: Prepare update-assets.zip
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
echo "Looking for 'update-assets.zip' from release '${{ steps.get_base_release.outputs.base_release }}'"
ASSETS=$(gh release view "${{ steps.get_base_release.outputs.base_release }}" \
--repo "${{ github.repository }}" \
--json assets \
| jq -r '.assets[].name')
if echo "$ASSETS" | grep -xq "update-assets.zip"; then
mkdir -p update_assets_temp renamed
echo "Downloading assets from release '${{ steps.get_base_release.outputs.base_release }}'"
gh release download "${{ steps.get_base_release.outputs.base_release }}" \
--repo ${{ github.repository }} \
--pattern "update-assets.zip" \
-D update_assets_temp
unzip -q update_assets_temp/update-assets.zip -d update_assets_temp
cd update_assets_temp
zip -r ../renamed/update-assets.zip . -i assets
else
echo "No 'update-assets.zip' file found in release '${{ steps.get_base_release.outputs.base_release }}'; please make sure to have this file in that older release in order to generate the differences."
exit 1
fi
- name: Prepare pre-changelog message
id: pre_changelog_message
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
echo "Preparing a pre-changelog message..."
BODY="If you would like to download the full builds of the engine from this release, please ignore the files starting with 'update-' as they're needed for the engine's internal autoupdater.\n\n"
if [ -n "${{ github.event.inputs.custom_message }}" ]; then
BODY="${{ github.event.inputs.custom_message }}\n${BODY}"
fi
{
echo "body<<EOF"
echo -e "$BODY"
echo "EOF"
} >> $GITHUB_OUTPUT
echo -e "Final pre-changelog message:\n\n$BODY"
- name: Create GitHub Release with Assets
uses: softprops/action-gh-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.event.inputs.tag_name }}
name: Release ${{ github.event.inputs.tag_name }}
draft: true
prerelease: ${{ github.event.inputs.prerelease }}
body: ${{ steps.build_body.outputs.body }}
generate_release_notes: true
files: |
renamed/Codename Engine-Windows.zip
renamed/Codename Engine-Mac.zip
renamed/Codename Engine-Mac.tar.gz
renamed/Codename Engine-Linux.zip
renamed/update-assets.zip
renamed/update-windows.exe
renamed/update-mac
renamed/update-linux
+2 -2
View File
@@ -12,9 +12,9 @@ jobs:
- name: Pulling the new commit
uses: actions/checkout@v2
- name: Setting up Haxe
uses: krdlab/setup-haxe@v1
uses: krdlab/setup-haxe@v2
with:
haxe-version: 4.2.5
haxe-version: 4.3.7
- name: Restore existing build cache for faster compilation
uses: actions/cache@v3
with:
+37 -2
View File
@@ -1,10 +1,45 @@
{
"editor.detectIndentation": false,
"editor.insertSpaces": false,
"editor.tabSize": 4,
"files.associations": {
"*.hx": "haxe",
"*.hscript": "haxe",
"*.hsc": "haxe",
"*.hxs": "haxe"
}
"*.hxs": "haxe",
"*.hxp": "haxe"
},
"lime.projectFile": "project.hxp",
"lime.targetConfigurations": [
{
"label": "Windows (Test Build)",
"target": "windows",
"args": ["-DTEST_BUILD"]
},
{
"label": "Linux (Test Build)",
"target": "linux",
"args": ["-DTEST_BUILD"]
},
{
"label": "MacOS (Test Build)",
"target": "macos",
"args": ["-DTEST_BUILD"]
},
{
"label": "Windows / Debug (Test Build)",
"target": "windows",
"args": ["-debug", "-DTEST_BUILD"]
},
{
"label": "Linux / Debug (Test Build)",
"target": "linux",
"args": ["-debug", "-DTEST_BUILD"]
},
{
"label": "MacOS / Debug (Test Build)",
"target": "macos",
"args": ["-debug", "-DTEST_BUILD"]
},
]
}
+2 -6
View File
@@ -26,6 +26,7 @@ This changelog lists every change that has been added since the last update (inc
- `--fast` for quickly downloading git libraries, but requires you to reinstall it fully when updates happen
- Alphabet now allows multiple lines in the text ([d519db0](https://github.com/CodenameCrew/CodenameEngine/commit/d519db011a14aac0ddfc052089836c6b445f7f44))
- Allow importing mod root level modules in hscript, instead of only source/ ([7e66ee8](https://github.com/CodenameCrew/CodenameEngine/commit/7e66ee81e24204cd152de20046fa1500bb9d204b))
- Made the substate have the possibility to open automatically transitions ([d31454c](https://github.com/CodenameCrew/CodenameEngine/commit/d31454c7ddf4cbf6a681cc8b32cd3f9480f8eacd))
- Added a way to force animations in the `Play Animation` event ([d7b6fbe](https://github.com/CodenameCrew/CodenameEngine/commit/d7b6fbe510edeb832112ab5adc8ab19dfe97d77f))
- Adde unused boyfriend animations ([be55696](https://github.com/CodenameCrew/CodenameEngine/commit/be55696bbefe537f06ad6550b039278ffcbcfb2f))
- Made it display the keybind for the mod menu in main menu ([1ac2e7f](https://github.com/CodenameCrew/CodenameEngine/commit/1ac2e7f53390a9e92aa2a1fea94d147ed50d3694))
@@ -197,9 +198,4 @@ This changelog lists every change that has been added since the last update (inc
- Cleaned up the controls code ([c3580cf](https://github.com/CodenameCrew/CodenameEngine/commit/c3580cf1413f90386dd52763042e11b20d21ce2d), [c1123b9](https://github.com/CodenameCrew/CodenameEngine/commit/c1123b9e3c3c1887888744e0c62827231abc48be))
- Cleaned up unused variables in TitleState ([2779ef3](https://github.com/CodenameCrew/CodenameEngine/commit/2779ef3314471558e371b3ec2f17f8d4df48943a))
- Restructured the events folder ([77b7eeb](https://github.com/CodenameCrew/CodenameEngine/commit/77b7eebed1ea077516ff884902528c0ff3d01872))
- Reduced the amount of data thats stored for the Github Contributors savefile ([2abc45a](https://github.com/CodenameCrew/CodenameEngine/commit/2abc45a9e416a1c5dd2bd0a5297c664e60c6f1d8))
## Unsorted list
- @NexIsDumb Please document this i still dont understand it ([d31454c](https://github.com/CodenameCrew/CodenameEngine/commit/d31454c7ddf4cbf6a681cc8b32cd3f9480f8eacd))
- Reduced the amount of data thats stored for the Github Contributors savefile ([2abc45a](https://github.com/CodenameCrew/CodenameEngine/commit/2abc45a9e416a1c5dd2bd0a5297c664e60c6f1d8))
+3 -2
View File
@@ -1,5 +1,5 @@
# Codename Engine features
This markdown file contains every single feature Codename has, separated into multiple categories. List may be incomplete.
This markdown file contains most of the main features Codename has, separated into multiple categories.
_**QOL = Quality of Life**_
@@ -79,4 +79,5 @@ _**QOL = Quality of Life**_
- Features not found in other editors!
- Every single state & substate can be modified via HScript (`data/states/StateName.hx`)
- **Instances launched via `lime test windows` will automatically use assets from source.**
</details>
- Modcharting features powered by [FunkinModchart](https://lib.haxe.org/p/funkin-modchart/).
</details>
+72 -58
View File
@@ -1,90 +1,104 @@
# Friday Night Funkin' - Codename Engine (WIP)
# Friday Night Funkin' - Codename Engine
## PLEASE NOTE - THIS IS STILL IN A BETA STATE
### Mods created with beta versions of Codename may not be compatible with the release version
Known issues in the beta:
- Some options are missing
![Animated-Banner](https://github.com/user-attachments/assets/5830221d-d954-4be3-afe8-caae364a5881)
Build instructions are below. Press TAB on the main menu to switch mods.
Codename Engine is a cross platform [Friday Night Funkin'](https://github.com/FunkinCrew/Funkin) Engine aimed at simplifying modding focusing on softcoding, along with extensiblity and ease of use.<br>
It is the the official successor of the previously well known [Yoshi Engine](https://github.com/CodenameCrew/YoshiCrafterEngine).
Also, the command `.\cne test` uses the source assets folder instead of the export one for easier development (Although you can still use `lime test windows` normally).
The engine uses [HaxeFlixel](https://haxeflixel.com/) and it mainly features:
- A full scripting system with an optimized fork of [Hscript](https://lib.haxe.org/p/hscript/) (its name is [Hscript Improved](https://github.com/CodenameCrew/hscript-improved))
- Uses forks of popular libraries tailored specifically for the engine for the goal of better optimization.
- Modding system and softcoding is as capable as source coding.
- Focuses heavily on optimization, and encourages its users to also take on optimization practices.
- Many modding tools without changing the core gameplay and the base to mod on.
- Allows modularity using addons and mods that apply on top of the core mod.
- Advanced editors which allows for possibly better experience and easiness when creating the mod.
- Much more can be read [HERE](FEATURES.md)
## Codename Engine
> [!NOTE]
> Please keep in mind that, despite these differences, we do not consider our engine to be any better or worse than the others.
Codename Engine is a new Friday Night Funkin' Engine aimed at simplifying modding, along with extensiblity and ease of use.<br>
### Before making issues or need help with something, check our website [HERE](https://codename-engine.com/) (it contains a wiki of how to mod with EXAMPLES, an api, lists of mods made with Codename Engine and more)!!!
#### The Engine includes many new features, as seen [here](FEATURES.md)<br>
#### Wanna see the new features added in the most recent update? Click [here](PATCHNOTES.md)<br>
---
## How to download
> [!CAUTION]
> Want to use this project's code for different purposes or something similar? Check out the ***Usage Info*** part below first, it basically explains what you can do or not do!<br>
> We love open source but we also love proper credits for having respect of all the people who worked hard on this project!!
Latest builds for the engine can be found in the [Actions](https://github.com/YoshiCrafter29/CodenameEngine/actions) tab.<br>
In the future (when the engine won't be a WIP anymore) we're gonna also publish the engine on platforms like Gamebanana; stay tuned!
> [!WARNING]
> Before making issues or if you need help with something, check our website [HERE](https://codename-engine.com/).<br>
> It contains a wiki of how to mod with EXAMPLES, an api, lists of mods made with Codename Engine and more!
If you don't have a github account please go onto https://fnf-cne-devs.github.io/ and click the download button for the respective operating system.
> [!TIP]
> Want to stay updated with this project?<br>
> Check out our [patch notes](PATCHNOTES.md)!
---
<img width="1080" height="146" alt="immagine" src="https://github.com/user-attachments/assets/93604082-6bac-4ffc-99b0-5393b1e340a4" />
<br><br>
<img width="1280" height="720" alt="immagine" src="https://github.com/user-attachments/assets/4106f77a-40f8-4159-9f4e-b601cc79e1d0" />
<img width="1280" height="720" alt="immagine" src="https://github.com/user-attachments/assets/2c06f5ea-3462-459b-982e-bf4eddf3d099" />
<img width="1280" height="720" alt="immagine" src="https://github.com/user-attachments/assets/4979e256-6b99-4857-8a2a-96abd94f9c4e" />
<img width="1280" height="720" alt="immagine" src="https://github.com/user-attachments/assets/55a5a710-55b9-4988-bdcc-0977ba1de97a" />
<img width="1280" height="720" alt="immagine" src="https://github.com/user-attachments/assets/4676b035-bec7-445b-a303-78e66f11c479" />
---
> [!NOTE]
> Codename Engine as for now supports **Windows x64**, **Mac OS x64** and **Linux x64**.<br>
> More platforms will soon come, stay tuned!<br>
> - [ ] **Web (HTML5) Support**
> - [ ] **Mobile Support**
<details>
<summary><h2>How to build</h2></summary>
<summary><h2>How to download</h2></summary>
> **Open the instructions for your platform**
<details>
<summary>Windows</summary>
- Stable builds of the engine can be found on our [GameBanana](https://gamebanana.com/mods/598553) or our [itch.io](https://nex-isdumb.itch.io/codename-engine) pages.
- Latest *EXPERIMENTAL* builds of the engine can be found in the [Actions](https://github.com/CodenameCrew/CodenameEngine/actions) tab. **REQUIRES A GITHUB ACCOUNT!!**
##### Tested on Windows 10 21H2
1. Install [version 4.2.5 of Haxe](https://haxe.org/download/version/4.2.5/).
2. Download and install [`git-scm`](https://git-scm.com/download/win).
- Leave all installation options as default.
3. Run `update.bat` using cmd or double-clicking it, and wait for the libraries to install.
4. Once the libraries are installed, run `haxelib run lime test windows` to compile and launch the game (may take a long time)
- ℹ You can run `haxelib run lime setup` to make the lime command global, allowing you to execute `lime test windows` directly.
</details>
<details>
<summary>Linux</summary>
##### Requires testing
1. Install [version 4.2.5 of Haxe](https://haxe.org/download/version/4.2.5/).
2. Install `g++`, if not present already.
3. Download and install [`git-scm`](https://git-scm.com/download/linux).
4. Open a terminal in the Codename Engine source folder, and run `update.sh`.
5. Once the libraries are installed, run `haxelib run lime test linux` to compile and launch the game (may take a long time)
- ℹ You can run `haxelib run lime setup` to make the lime command global, allowing you to execute `lime test linux` directly.
</details>
<details>
<summary>MacOS</summary>
##### Requires testing
1. Install [version 4.2.5 of Haxe](https://haxe.org/download/version/4.2.5/).
2. Install `Xcode` to allow C++ app building.
3. Download and install [`git-scm`](https://git-scm.com/download/mac).
4. Open a terminal in the Codename Engine source folder, and run `update.sh`.
5. Once the libraries are installed, run `haxelib run lime test mac` to compile and launch the game (may take a long time)
- ℹ You can run `haxelib run lime setup` to make the lime command global, allowing you to execute `lime test mac` directly.
</details>
If you don't have a GitHub account to download experimental builds, you can also go onto our [official website](https://codename-engine.com/) and click the download button for the respective operating system under the **Experimental** section.
</details>
<details>
<summary><h2>What can you do or not do</h2></summary>
<summary><h2>How to mod</h2></summary>
### You can:
Check out our wiki [HERE](https://codename-engine.com/wiki/)
</details>
<details>
<summary><h2>How to setup and build</h2></summary>
Check out our guide [HERE](building/README.md)
</details>
<details>
<summary><h2>Usage Info</h2></summary>
### Feel free to:
- Download and play the engine with its mods and modpacks
- Mod and fork the engine (without using it for illicit purposes)
- Contribute to the engine (for example through *Pull Requests*, *Issues*, etc)
- Contribute to the engine (for example through *Pull Requests*, *Issues*, etc.)
- Create a sub engine with Codename Engine as **TEMPLATE** with **CREDITS** (for example leaving the *credits menu submenu with the GitHub contributors* and putting the *[main devs](https://github.com/CodenameCrew)* in a *README* specifying that it's a *sub engine from Codename Engine*)
- Release excutable mods that use Codename Engine as source (Specifing that uses Codename Engine by for example the same way written above this)
- Release modpacks
- Release excutable mods that use Codename Engine as source (specifing that uses Codename Engine by for example the same way written above this)
- Release Codename Engine modpacks
### You can't:
### Please do not:
- Create a *side/new/etc* engine (or mod that doesn't use Codename Engine) using Codename Engine's code
- Steal code from Codename Engine for another different project that is not Codename Engine related (Codename Engine mods excluded) without properly crediting
- Release the entire Codename Engine on platforms (Mods that use Codename Engine as source are fine, if it's specified even better)
- Release the entirety of Codename Engine on platforms (mods that use Codename Engine as source are fine)
#### *If you need more info or feel like asking to do something which is not listed here, ask us directly on our discord (linked on the website)!*
#### *If you need more info or feel like asking to do something which is not listed here, ask us directly on our [discord server](https://discord.com/servers/codename-engine-860561967383445535)!*
</details>
<details>
<summary><h2>Credits</h2></summary>
- All main Credits can be seen inside the Engine and specifically [HERE](https://github.com/CodenameCrew/CodenameEngine/graphs/contributors)
- Credits to the [FlxAnimate](https://github.com/Dot-Stuff/flxanimate) team for the Animate Atlas support
- Credits to Smokey555 for the backup Animate Atlas to spritesheet code
- Credits to MAJigsaw77 for [hxvlc](https://github.com/MAJigsaw77/hxvlc) (video cutscene/mp4 support) and [hxdiscord_rpc](https://github.com/MAJigsaw77/hxdiscord_rpc) (discord rpc integration)
- Credits to [TheoDev](https://github.com/TheoDevelops) for [FunkinModchart](https://lib.haxe.org/p/funkin-modchart/). ***(library used for modcharting features)***
- Credits to [Ninjamuffin99](https://github.com/ninjamuffin99) and the [Funkin Crew](https://github.com/FunkinCrew) for the base game Friday Night Funkin'
</details>
-61
View File
@@ -1,61 +0,0 @@
# Codename Engine Todo List
## `v1.0.0` - Initial release
- [x] Remove Herobrine
- [ ] Chart Editor
- [x] Place & Delete notes
- [x] Ctrl+Z & Ctrl+Y
- [x] Selection box & dragging
- [x] Scroll bar at the right + Song info
- [x] Fix the strumlines bar when zooming out
- [x] Algorithm to make note placements faster & sorted out
- [x] Play here working
- [x] Cap zoom in & out
- [x] Events (including Camera Movement)
- [x] Metadata Editing
- [ ] Custom Notetypes
- [ ] Reorderable Strumlines
- [ ] Step based zooming
- [ ] Add Undo to more actions
- [ ] New Chart Button
- [ ] Bug fixes
- [ ] Zooming in causing notes to disappear
- [ ] Holds disappear too early
- [ ] Time signature fixes
- [ ] BPM Changes Events
- [ ] Character Editor
- [x] Animation Editing
- [x] Animation Deletion/Creation
- [x] Character Info Editing
- [x] Character Saving
- [x] Add Undos to Actions
- [ ] Change Stage
- [ ] New Character Button
- [ ] Port Videos to a more stable video lib
- [ ] Optimization to Editors
- [ ] Fix Ratings Lag
- [x] Re-export gf-christmas, gf-car and gf-tankmen with padding
- [x] Re-add shader camera stuff
- [x] Make update.bat use libs.xml instead of hmm.json
- [ ] New Switch Mod menu
- [x] Port shader camera stuff over to new flixel fork
- [ ] Add note offset
- [x] Dialogue
- [ ] Finish Base Game port
- [x] Add credits
- [x] Verbose mode (`--verbose`)
- [ ] Tooltips
- [ ] Fix bugs
## `v1.1.0`
- [ ] Charter Waveforms (maybe in v1.1.0, don't wanna slow shit down)
- [ ] Custom classes
- [ ] Proper super overrides (FlxText_HSX doesn't allow overrides for update because of this)
- [ ] Custom Class extending Custom Classes
- [ ] Statics on Custom Classes
- [ ] Fix Bugs
- [ ] Full 3D support via stages files
- [ ] Multithread sprites and assets loading (for faster load times) ?
- [ ] Stage Editor
- [ ] Optimize flxanimate isOnScreen
Binary file not shown.
Binary file not shown.
Binary file not shown.
+28
View File
@@ -47,10 +47,18 @@
<anim char="8">character-eight</anim>
<anim char="9">character-nine</anim>
<composite char="ã">
<component anim="character-a0" x="0" y="0"/>
<component anim="diacritic-tilde-fill" x="11" y="73" outline="diacritic-tilde-outline" outlineX="-1" hasOutline="true"/>
</composite>
<composite char="ẽ">
<component anim="character-e0" x="0" y="0"/>
<component anim="diacritic-tilde-fill" x="3" y="73" outline="diacritic-tilde-outline" outlineX="-1" hasOutline="true"/>
</composite>
<composite char="õ">
<component anim="character-o0" x="0" y="0"/>
<component anim="diacritic-tilde-fill" x="8" y="73" outline="diacritic-tilde-outline" outlineX="-1" hasOutline="true"/>
</composite>
<composite char="ñ">
<component anim="character-n0" x="0" y="0"/>
<component anim="diacritic-tilde-fill" x="3" y="73" outline="diacritic-tilde-outline" outlineX="-1" hasOutline="true"/>
@@ -75,6 +83,22 @@
<component anim="character-u0" x="0" y="0"/>
<component anim="diacritic-acute-fill" x="15" y="60" outline="diacritic-acute-outline" outlineX="-1" hasOutline="true"/>
</composite>
<composite char="â">
<component anim="character-a0" x="0" y="0"/>
<component anim="diacritic-circumflex-fill" x="13" y="70" outline="diacritic-circumflex-outline" outlineX="-1" hasOutline="true"/>
</composite>
<composite char="ê">
<component anim="character-e0" x="0" y="0"/>
<component anim="diacritic-circumflex-fill" x="6" y="70" outline="diacritic-circumflex-outline" outlineX="-1" hasOutline="true"/>
</composite>
<composite char="ô">
<component anim="character-o0" x="0" y="0"/>
<component anim="diacritic-circumflex-fill" x="11" y="70" outline="diacritic-circumflex-outline" outlineX="-1" hasOutline="true"/>
</composite>
<composite char="à">
<component anim="character-a0" x="0" y="0"/>
<component anim="diacritic-acute-fill" x="16" y="70" outline="diacritic-acute-outline" outlineX="1" hasOutline="true" flipX="true"/>
</composite>
<composite char="ą">
<component anim="character-a0" x="0" y="0"/>
<component anim="diacritic-ogonek-fill" x="34" y="-12" outline="diacritic-ogonek-outline" outlineX="2" outlineY="-2" hasOutline="true"/>
@@ -83,6 +107,10 @@
<component anim="character-e0" x="0" y="0"/>
<component anim="diacritic-ogonek-fill" x="23" y="-14" outline="diacritic-ogonek-outline" outlineX="2" outlineY="-2" hasOutline="true"/>
</composite>
<composite char="ç">
<component anim="character-c0" x="0" y="0"/>
<component anim="diacritic-cadilla-fill" x="20" y="-15" outline="diacritic-cadilla-outline" outlineX="3" outlineY="-1" hasOutline="true"/>
</composite>
<composite char="ć">
<component anim="character-c0" x="0" y="0"/>
<component anim="diacritic-acute-fill" x="18" y="73" outline="diacritic-acute-outline" outlineX="-1" hasOutline="true"/>
+6 -6
View File
@@ -8,7 +8,7 @@ function onDiscordPresenceUpdate(e) {
var data = e.presence;
if(data.button1Label == null)
data.button1Label = "meow"; // "Codename Engine Discord"
data.button1Label = "Codename Engine Discord";
if(data.button1Url == null)
data.button1Url = "https://discord.gg/2NTCdsQvx4";
}
@@ -33,8 +33,8 @@ function onEditorTreeLoaded(name:String) {
DiscordUtil.changePresenceSince("Choosing a Character", null);
case "Chart Editor":
DiscordUtil.changePresenceSince("Choosing a Chart", null);
//case "Stage Editor": // secret for now
// DiscordUtil.changePresenceSince("Choosing a Stage", null);
case "Stage Editor": // secret for now
DiscordUtil.changePresenceSince("Choosing a Stage", null);
}
}
@@ -44,7 +44,7 @@ function onEditorLoaded(name:String, editingThing:String) {
DiscordUtil.changePresenceSince("Editing a Character", editingThing);
case "Chart Editor":
DiscordUtil.changePresenceSince("Editing a Chart", editingThing);
//case "Stage Editor":
// DiscordUtil.changePresenceSince("Editing a Stage", editingThing);
case "Stage Editor":
DiscordUtil.changePresenceSince("Editing a Stage", editingThing);
}
}
}
@@ -51,7 +51,7 @@
<stepper name="alphaStepper" label="${translate('alpha')}" value="char.alpha / 0.75" x="col(0)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="angleStepper" label="${translate('angle')}" value="char.angle" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="zoomFactorStepper" label="${translate('zoomFactor')" value="char.zoomFactor" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="zoomFactorStepper" label="${translate('zoomFactor')}" value="char.zoomFactor" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
<section if="!StringTools.startsWith(char.name, 'NO_DELETE_')">
<textbox name="charName" label="${translate('positionName')}" value="char.name" x="col(2)" y="curY" width="100"/>
+7 -5
View File
@@ -1,9 +1,11 @@
var sound:Sound;
var sound:FlxSound;
function create()
sound = Paths.sound('jeffGameover/jeffGameover-' + FlxG.random.int(1, 25, !Options.naughtyness ? [1, 3, 8, 13, 17, 21] : null));
function create() {
sound = FlxG.sound.load(Paths.sound('jeffGameover/jeffGameover-' + FlxG.random.int(1, 25, !Options.naughtyness ? [1, 3, 8, 13, 17, 21] : null)));
sound.onComplete = () -> FlxG.sound.music.fadeIn(4, 0.2, 1);
}
function beatHit(cur:Int) if (cur == 0) {
FlxG.sound.play(sound, 1, false, null, true, () -> if (!isEnding) FlxG.sound.music.fadeIn(4, 0.2, 1));
function postDeathStart() {
sound.play();
FlxG.sound.music.volume = 0.2;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

+1 -1
View File
@@ -16,5 +16,5 @@ version="version based on the English config.ini version"
4. Translate the texts in the copied xml files. The {0} and {1}, and so on are placeholders are used for variables, and should be left as is.
5. Make a pull request with your changes.
5. **If you wanna help us with the language(s) you added in the engine**: Make a pull request with your changes.
Make sure the pull request is labeled as `[LANG] Add <language name>` or `[LANG] Update <language name>` or `[LANG] Fix typo in <language name>`, generally anything is allowed but it has to contain the language name.
+18 -2
View File
@@ -9,6 +9,8 @@
<str id="save">Save</str>
<str id="saveClose">Save &amp; Close</str>
<str id="close">Close</str>
<str id="notNow">Not Now</str>
<str id="yes">Yes</str>
</group>
<group name="UIImageExplorer" prefix="uiImageExplorer.">
@@ -43,12 +45,15 @@
<group name="CharterSelection" prefix="charterSelection.">
<str id="desc">Select a song to modify the charts from.</str>
<str id="acceptSong">Press ACCEPT to choose a difficulty to edit.</str>
<str id="acceptVariation">Press ACCEPT to choose a song variation to edit.</str>
<str id="acceptDifficulty">Press ACCEPT to edit the chart for the selected difficulty.</str>
<str id="selectDifficulty">Select a difficulty to continue.</str>
<str id="newDifficulty">New Difficulty</str>
<str id="newDifficultyDesc">Press ACCEPT to create a new chart difficulty.</str>
<str id="newSong">New Song</str>
<str id="newSongDesc">Press ACCEPT to create a new song.</str>
<str id="newVariation">New Variation</str>
<str id="newVariationDesc">Press ACCEPT to create a new song variation.</str>
</group>
<group name="ChartCreationScreen" prefix="chartCreation.">
@@ -102,6 +107,7 @@
<str id="songData">Song Data</str>
<str id="songName">Song Name</str>
<str id="variation">Song Variation</str>
<str id="bpm">BPM</str>
<str id="timeSignature">Time Signature</str>
<str id="menusData">Menus Data (Freeplay/Story)</str>
@@ -111,6 +117,7 @@
<str id="color">Color</str>
<str id="difficulties">Difficulties</str>
<str id="customValues">Custom Values (Advanced)</str>
<str id="needsVoices">Needs Voices</str>
<str id="opponentMode">Opponent Mode</str>
<str id="coopAllowed">Co-op Mode</str>
@@ -236,7 +243,7 @@
<group name="BookmarkMenu" prefix="bookmarks.">
<str id="addBookmarkHere">Add Bookmark Here</str>
<str id="editBookmarkList">Edit Bookmark List</str>
<str id="goto">Go to "{0}"</str>
<str id="goTo">Go to "{0}"</str>
<str id="createBookmarkTitle">Creating New Bookmark...</str>
<str id="createBookmarkName">Bookmark Name:</str>
<str id="createBookmarkColor">Bookmark Color:</str>
@@ -481,6 +488,7 @@
<str id="newGlyph">New Glyph</str>
<str id="editGlyph">Edit Glyph</str>
<str id="deleteGlyph">Delete Glyph</str>
<str id="deleteCurGlyph">Delete Current Glyph</str>
</group>
<str id="topBar.offset">Offsets</str>
@@ -571,7 +579,7 @@
</group>
</group>
<group name="StageInfoScreen" prefix="stageInfoScreen">
<group name="StageInfoScreen" prefix="stageInfoScreen.">
<str id="win-title">Editing Stage "{0}" Infos</str>
<str id="title">Stage Info</str>
<str id="stageName">Stage Name</str>
@@ -665,4 +673,12 @@
<str id="saveAndExitToMenu">Save &amp; Exit To Menu</str>
<str id="cancel">Cancel</str>
</group>
<group name="ModConfigWarning" prefix="modConfigWarning.">
<str id="warningTitle">Missing mod folder configuration!</str>
<str id="warningDesc">Your mod is currently missing a mod config file!\n\nWould you like to automatically generate one?\n\n(PS: If this is not your mod please disable Developer mode to stop this popup from appearing.)</str>
<str id="createdTitle">Created mod config!</str>
<str id="createdDesc">Your mod config file has been created at {0}!</str>
</group>
</language>
+3
View File
@@ -42,6 +42,7 @@
<str id="back">Back</str>
<str id="reset">Reset</str>
<str id="pause">Pause</str>
<str id="changeMode">Change Mode</str>
</group>
<str id="category.engine">Engine</str>
@@ -50,6 +51,8 @@
</group>
<str id="category.volume">Volume</str>
<str id="volume.up">Up</str>
<str id="volume.down">Down</str>
<str id="volume.mute">Mute</str>
<str id="category.developer">Developer</str>
+3 -2
View File
@@ -105,6 +105,7 @@
<str id="modesAllowed">Modos Permitidos</str>
<str id="difficulties">Difficultades</str>
<str id="customValues">Valores Especiales (Avanzado)</str>
<str id="needsVoices">Necesita Voces</str>
<str id="opponentMode">Modo Oponente</str>
<str id="coopAllowed">Modo Co-op</str>
@@ -225,7 +226,7 @@
<group name="BookmarkMenu" prefix="bookmarks.">
<str id="addBookmarkHere">Añadir Marcador Aquí</str>
<str id="editBookmarkList">Editar Lista de Marcadores</str>
<str id="goto">Ir hacia "{0}"</str>
<str id="goTo">Ir hacia "{0}"</str>
<str id="createBookmarkTitle">Creando Nuevo Marcador...</str>
<str id="createBookmarkName">Nombre de Marcador:</str>
<str id="createBookmarkColor">Color de Marcador:</str>
@@ -544,7 +545,7 @@
<str id="stagePath">Ubicación de Imágenes</str>
</group>
<group name="StageInfoScreen" prefix="stageInfoScreen">
<group name="StageInfoScreen" prefix="stageInfoScreen.">
<str id="win-title">Editando info. del escenario: "{0}"</str>
<str id="title">Info. del Escenario</str>
<str id="stageName">Nombre del Escenario</str>
+2
View File
@@ -49,6 +49,8 @@
</group>
<str id="category.volume">Volumen</str>
<str id="volume.up">Arriba</str>
<str id="volume.down">Abajo</str>
<str id="volume.mute">mutear</str>
<str id="category.developer">Desarrollador</str>
+4 -3
View File
@@ -108,8 +108,9 @@
<str id="color">Colore</str>
<str id="difficulties">Difficoltà</str>
<str id="customValues">Valori Personalizzati (Avanzato)</str>
<str id="needsVoices">Bisogno Voci</str>
<str id="opponentMode">Modalità Avvers.</str>
<str id="opponentMode">Modalità Avvers</str>
<str id="coopAllowed">Modalità Co-op</str>
</group>
@@ -231,7 +232,7 @@
<group name="BookmarkMenu" prefix="bookmarks.">
<str id="addBookmarkHere">Aggiungi Segnalibro Qui</str>
<str id="editBookmarkList">Modifica Lista Segnalibri</str>
<str id="goto">Vai a "{0}"</str>
<str id="goTo">Vai a "{0}"</str>
<str id="createBookmarkTitle">Creazione nuovo Segnalibro...</str>
<str id="createBookmarkName">Nome Segnalibro:</str>
<str id="createBookmarkColor">Colore Segnalibro:</str>
@@ -554,7 +555,7 @@
<str id="stagePath">Percorso file Palcoscenico</str>
</group>
<group name="StageInfoScreen" prefix="stageInfoScreen">
<group name="StageInfoScreen" prefix="stageInfoScreen.">
<str id="win-title">Modificando Informazioni Palcoscenico "{0}"</str>
<str id="title">Informazioni Palcoscenico</str>
<str id="stageName">Nome Palcoscenico</str>
+2
View File
@@ -48,6 +48,8 @@
<str id="switchMod">Cambia Mod</str>
</group>
<str id="volume.up">Su</str>
<str id="volume.down">Giù</str>
<str id="volume.mute">Muto</str>
<str id="category.developer">Sviluppatore</str>
+13 -2
View File
@@ -9,6 +9,8 @@
<str id="save">Zapisz</str>
<str id="saveClose">Zapisz i Zamknij</str>
<str id="close">Zamknij</str>
<str id="notNow">Nie Teraz</str>
<str id="yes">Tak</str>
</group>
<group name="UIImageExplorer" prefix="uiImageExplorer.">
@@ -109,6 +111,7 @@
<str id="color">Kolor</str>
<str id="difficulties">Trudności</str>
<str id="customValues">Własna Waluta (Zaawansowane)</str>
<str id="needsVoices">Potrzebne Wokale</str>
<str id="opponentMode">Tryb Przeciwnika</str>
<str id="coopAllowed">Tryb Ko-operacyjny</str>
@@ -234,7 +237,7 @@
<group name="BookmarkMenu" prefix="bookmarks.">
<str id="addBookmarkHere">Dodaj Zakładkę Tutaj</str>
<str id="editBookmarkList">Edytuj Listę Zakładek</str>
<str id="goto">Idź do "{0}"</str>
<str id="goTo">Idź do "{0}"</str>
<str id="createBookmarkTitle">Tworzenie Nowej Zakładki...</str>
<str id="createBookmarkName">Nazwa Zakładki:</str>
<str id="createBookmarkColor">Kolor Zakładki:</str>
@@ -559,7 +562,7 @@
<str id="stagePath">Ścieżka Plikowa Sceny</str>
</group>
<group name="StageInfoScreen" prefix="stageInfoScreen">
<group name="StageInfoScreen" prefix="stageInfoScreen.">
<str id="win-title">Edytowanie Info Sceny "{0}"</str>
<str id="title">Info Sceny</str>
<str id="stageName">Nazwa Sceny</str>
@@ -653,4 +656,12 @@
<str id="saveAndExitToMenu">Zapisz i Wyjdź do Menu</str>
<str id="cancel">Anuluj</str>
</group>
<group name="ModConfigWarning" prefix="modConfigWarning.">
<str id="warningTitle">Brakujący plik konfiguracyjny modu!</str>
<str id="warningDesc">Twój mod obecnie brakuje jego pliku konfiguracyjnego!\n\nCzy chcesz go automatycznie wygenerować?\n\n(PS: Jeżeli to nie twój mod, wyłącz Tryb Dewelopera, aby zapobiec wyskakiwaniu się tego okienka.)</str>
<str id="createdTitle">Utworzono konfigurację modu!</str>
<str id="createdDesc">Twój plik konfiguracyjny modu został utworzony w {0}!</str>
</group>
</language>
+1 -1
View File
@@ -57,7 +57,7 @@
<str id="credits.allContributors">Wszyscy współpracownicy silnika! - Naciśnij RESET aby zaktualizować listę (Jeden reset co 2 minuty).</str>
</group>
<group name="CreditsMain">
<str id="credits.name">Kredyty</str>
<str id="credits.name">Twórcy</str>
<str id="credits.madePossible">Ludzie którzy to umożliwili!</str>
<str id="credits.selectCodename">Wybierz to aby zobaczyć wszystkich współpracowników!</str>
<str id="credits.selectBase">Wybierz to aby otworzyć stronę itch.io oryginalnej gry!</str>
+3
View File
@@ -38,6 +38,7 @@
<str id="back">Wstecz</str>
<str id="reset">Reset</str>
<str id="pause">Pauza</str>
<str id="changeMode">Zmień Tryb</str>
</group>
<str id="category.engine">Silnik</str>
@@ -46,6 +47,8 @@
</group>
<str id="category.volume">Głośność</str>
<str id="volume.up">Głóśniej</str>
<str id="volume.down">Ciszej</str>
<str id="volume.mute">Wycisz</str>
<str id="category.developer">Deweloper</str>
Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<TextureAtlas imagePath="credits.png" width="3341" height="162">
<SubTexture name="credits basic0000" x="1" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits basic0001" x="1" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits basic0002" x="1" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits basic0003" x="443" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits basic0004" x="443" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits basic0005" x="443" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits basic0006" x="885" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits basic0007" x="885" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits basic0008" x="885" y="1" width="440" height="116" frameX="-0" frameY="-0" frameWidth="440" frameHeight="116"/>
<SubTexture name="credits white0000" x="2668" y="1" width="672" height="160" frameX="-0" frameY="25" frameWidth="672" frameHeight="160"/>
<SubTexture name="credits white0001" x="1327" y="1" width="669" height="156" frameX="-2" frameY="24" frameWidth="672" frameHeight="160"/>
<SubTexture name="credits white0002" x="1998" y="1" width="668" height="157" frameX="-4" frameY="22" frameWidth="672" frameHeight="160"/>
</TextureAtlas>
Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<TextureAtlas imagePath="freeplay.png" width="1027" height="927">
<SubTexture name="freeplay basic0000" x="1" y="556" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay basic0001" x="1" y="556" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay basic0002" x="1" y="556" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay basic0003" x="1" y="680" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay basic0004" x="1" y="680" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay basic0005" x="1" y="680" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay basic0006" x="1" y="804" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay basic0007" x="1" y="804" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay basic0008" x="1" y="804" width="701" height="122" frameX="-0" frameY="-0" frameWidth="701" frameHeight="122"/>
<SubTexture name="freeplay white0000" x="1" y="373" width="1020" height="181" frameX="-7" frameY="30" frameWidth="1027" frameHeight="188"/>
<SubTexture name="freeplay white0001" x="1" y="187" width="1021" height="184" frameX="-4" frameY="30" frameWidth="1027" frameHeight="188"/>
<SubTexture name="freeplay white0002" x="1" y="1" width="1025" height="184" frameX="-0" frameY="26" frameWidth="1027" frameHeight="188"/>
</TextureAtlas>
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<TextureAtlas imagePath="options.png" width="2449" height="159">
<SubTexture name="options basic0000" x="1" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options basic0001" x="1" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options basic0002" x="1" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options basic0003" x="346" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options basic0004" x="346" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options basic0005" x="346" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options basic0006" x="691" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options basic0007" x="691" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options basic0008" x="691" y="1" width="343" height="113" frameX="-0" frameY="-0" frameWidth="343" frameHeight="113"/>
<SubTexture name="options white0000" x="1036" y="1" width="474" height="156" frameX="-0" frameY="15" frameWidth="474" frameHeight="157"/>
<SubTexture name="options white0001" x="1512" y="1" width="465" height="156" frameX="-6" frameY="14" frameWidth="474" frameHeight="157"/>
<SubTexture name="options white0002" x="1979" y="1" width="469" height="157" frameX="-4" frameY="15" frameWidth="474" frameHeight="157"/>
</TextureAtlas>
Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<TextureAtlas imagePath="story mode.png" width="1230" height="556">
<SubTexture name="story mode basic0000" x="734" y="1" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode basic0001" x="734" y="1" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode basic0002" x="734" y="1" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode basic0003" x="734" y="119" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode basic0004" x="734" y="119" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode basic0005" x="734" y="119" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode basic0006" x="730" y="237" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode basic0007" x="730" y="237" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode basic0008" x="730" y="237" width="495" height="116" frameX="-0" frameY="-0" frameWidth="495" frameHeight="116"/>
<SubTexture name="story mode white0000" x="1" y="375" width="732" height="180" frameX="-0" frameY="28" frameWidth="732" frameHeight="186"/>
<SubTexture name="story mode white0001" x="1" y="1" width="731" height="185" frameX="-0" frameY="30" frameWidth="732" frameHeight="186"/>
<SubTexture name="story mode white0002" x="1" y="188" width="727" height="185" frameX="-0" frameY="29" frameWidth="732" frameHeight="186"/>
</TextureAtlas>
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Funkin Packer v0.1.3 https://neeeoo.github.io/funkin-packer/
-->
<TextureAtlas imagePath="titleEnter.png" width="1186" height="2650">
<SubTexture name="ENTER PRESSED0000" x="1" y="1" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="ENTER PRESSED0001" x="1" y="107" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="ENTER PRESSED0002" x="1" y="1" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="ENTER PRESSED0003" x="1" y="107" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="ENTER PRESSED0004" x="1" y="1" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="ENTER PRESSED0005" x="1" y="107" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="ENTER PRESSED0006" x="1" y="1" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="ENTER PRESSED0007" x="1" y="107" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0000" x="1" y="213" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0001" x="1" y="319" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0002" x="1" y="425" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0003" x="1" y="531" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0004" x="1" y="637" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0005" x="1" y="743" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0006" x="1" y="849" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0007" x="1" y="955" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0008" x="1" y="1061" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0009" x="1" y="1167" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0010" x="1" y="1273" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0011" x="1" y="1379" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0012" x="1" y="1485" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0013" x="1" y="1591" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0014" x="1" y="1697" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0015" x="1" y="1803" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0016" x="1" y="1909" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0017" x="1" y="2015" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0018" x="1" y="2121" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0019" x="1" y="2227" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0020" x="1" y="2333" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0021" x="1" y="2439" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0022" x="1" y="2545" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0023" x="1" y="2545" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0024" x="1" y="2439" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0025" x="1" y="2333" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0026" x="1" y="2227" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0027" x="1" y="2121" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0028" x="1" y="2015" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0029" x="1" y="1909" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0030" x="1" y="1803" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0031" x="1" y="1697" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0032" x="1" y="1591" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0033" x="1" y="1485" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0034" x="1" y="1379" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0035" x="1" y="1273" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0036" x="1" y="1167" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0037" x="1" y="1061" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0038" x="1" y="955" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0039" x="1" y="849" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0040" x="1" y="743" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0041" x="1" y="637" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0042" x="1" y="531" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0043" x="1" y="425" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0044" x="1" y="319" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
<SubTexture name="Press Enter to Begin0045" x="1" y="213" width="1184" height="104" frameX="-143" frameY="-1" frameWidth="1494" frameHeight="110"/>
</TextureAtlas>
+2 -2
View File
@@ -1,3 +1,3 @@
name="Polski"
credits="GlitchDotSmh & Kolze"
version="1.0.0"
credits="GlitchDotSmh, Kolze & Verwex"
version="1.1.0"
+686
View File
@@ -0,0 +1,686 @@
<?xml version="1.0" encoding="utf-8" ?>
<language>
<group name="General Editor Translations" prefix="editor.">
<str id="autosavingIn">Guardando automáticamente em {0} segundos{1}</str>
<str id="autosavingCanceledSuffix">(Cancelado)!</str>
<str id="ok">Ok</str>
<str id="cancel">Cancelar</str>
<str id="save">Guardar</str>
<str id="saveClose">Guardar e Fechar</str>
<str id="close">Fechar</str>
<str id="notNow">Agora Não</str>
<str id="yes">Sim</str>
</group>
<group name="UIImageExplorer" prefix="uiImageExplorer.">
<str id="symbol">Simbolo</str>
<str id="animation">Animação</str>
<str id="atlas">Atlas</str>
<str id="spritemap">Mapa de Sprites</str>
<str id="directory">Diretório ({0}/)</str>
<str id="found">{0} {1} Encontrado</str>
<str id="foundplural">{0} {1} Encontrado</str>
<str id="notFound">#{0}s NÃO Encontrado#</str>
<str id="foundAtlas">{0} Mapa de Sprites Encontrado</str>
<str id="foundAtlasplural">{0} Mapas de Sprites Encontrados</str>
<str id="fileAlreadyExists">Os seguintes ficheiros já existem: \n\n{0}\n\nIMPORTANTE: SUBSTITUIR NÃO PODE SER DESFEITO!</str>
<str id="override">Substituir Ficheiros</str>
<str id="useExisting">Usar Existentes</str>
</group>
<group name="EditorPicker" prefix="editor.">
<str id="alphabet.name">Editor de Alfabetos</str>
<str id="chart.name">Editor de Mapas</str>
<str id="character.name">Editor de Personagens</str>
<str id="stage.name">Editor de Cenários</str>
<str id="uiDebug.name">Interface de Depuração</str>
<str id="wiki.name">Wiki</str>
<str id="debugOptions.name">Opções de Depuração</str>
</group>
<group name="ChartEditor">
<group name="CharterSelection" prefix="charterSelection.">
<str id="desc">Selecione uma canção para modificar os seus mapas.</str>
<str id="acceptSong">Carregue em ACEITAR para escolher uma dificuldade para editar.</str>
<str id="acceptVariation">Carregue em ACEITAR para escolher uma variação para editar.</str>
<str id="acceptDifficulty">Carregue em ACEITAR para editar o mapa para a dificuldade selecionada.</str>
<str id="selectDifficulty">Selecione uma dificuldade para continuar.</str>
<str id="newDifficulty">Nova Dificuldade</str>
<str id="newDifficultyDesc">Carregue em ACEITAR para criar uma dificuldade nova.</str>
<str id="newSong">Nova Canção</str>
<str id="newSongDesc">Carregue em ACEITAR para criar uma canção nova.</str>
<str id="newVariation">Nova Variação</str>
<str id="newSongDesc">Carregue em ACEITAR para criar uma variação nova.</str>
</group>
<group name="ChartCreationScreen" prefix="chartCreation.">
<str id="title">A Criar um Mapa Novo</str>
<str id="info">Info. do Mapa</str>
<str id="diffName">Nome da Dificuldade</str>
<str id="stage">Cenário</str>
<str id="scrollSpeed">Velocidade das Notas</str>
<str id="strumLineList">Pistas $* Pelo menos 1 Pista Necessária$</str>
<str id="strumLine.format">Pistas - #{0}</str>
<group name="Warnings" prefix="warnings.">
<str id="song-exists-title">Criação de Canção: Erro!</str>
<str id="song-exists-body">A canção que está a tentar criar já existe, se a quiser substituir apague a canção primeiro!</str>
<str id="chart-exists-title">Criação de Mapa: Erro!</str>
<str id="chart-exists-body">O mapa que está a tentar criar já existe, se o quiser substituir apague o mapa primeiro!</str>
</group>
</group>
<group name="ChartDataScreen" prefix="chartDataScreen.">
<str id="title">Propriedades do Mapa</str>
<str id="editChartData">Editar Dados do Mapa</str>
<str id="stage">Cenário</str>
<str id="scrollSpeed">Velocidade das Notas</str>
</group>
<group name="SongPosInfo" prefix="songPosInfo.">
<str id="step">Passo: {0}</str>
<str id="beat">Batida: {0}</str>
<str id="measure">Medida: {0}</str>
<str id="bpm">BPM: {0}</str>
<str id="timeSignature">Compasso: {0}/{1}</str>
</group>
<group name="CharterEventScreen" prefix="charterEventScreen.">
<str id="title-creating">Criar Grupo de Eventos</str>
<str id="title-editing">Editar Grupo de Eventos</str>
<str id="noEvent">Sem Eventos</str>
<str id="strumLine.format">Pista #{0} ({1})</str>
</group>
<group name="CharterEventTypeSelection" prefix="charterEventTypeSelection.">
<str id="title">Escolha um tipo de evento...</str>
</group>
<group name="CharterMetaDataScreen" prefix="charterMetaDataScreen.">
<str id="title">Editar Metadados</str>
<str id="songData">Dados da Canção</str>
<str id="songName">Nome da Canção</str>
<str id="variation">Variação da Canção</str>
<str id="bpm">BPM</str>
<str id="timeSignature">Compasso</str>
<str id="menusData">Dados dos Menus (Jogo Livre/História)</str>
<str id="displayName">Nome Exibido</str>
<str id="icon">Ícone</str>
<str id="modesAllowed">Modos Permitidos</str>
<str id="color">Cor</str>
<str id="difficulties">Dificuldades</str>
<str id="customValues">Valores Especiais (Avançado)</str>
<str id="needsVoices">Necessita Vozes</str>
<str id="opponentMode">Modo Oponente</str>
<str id="coopAllowed">Modo Cooperativo</str>
</group>
<group name="CharterNoteTypesList" prefix="charterNoteTypesList.">
<str id="title">Editor da Lista de Tipos de Nota</str>
<str id="editNoteTypes">Editar Tipos de Nota</str>
<str id="editType">Tipo de Nota {0}</str>
</group>
<group name="CharterStrumlineScreen" prefix="charterStrumlineScreen.">
<str id="win-title-creating">A Criar a pista {0}</str>
<str id="win-title-editing">A Editar as propriedades da pista {0}</str>
<str id="title-creating">Criar Nova Pista</str>
<str id="title-editing">Editar Propriedades da Pista</str>
</group>
<group name="SongCreationScreen" prefix="songCreationScreen.">
<str id="win-title">A Criar Nova Canção</str>
<str id="win-title-importing">A Importar Canção</str>
<str id="title">Info. da Canção</str>
<str id="instAudio">Ficheiro do Instrumental $* Obrigatório*$</str>
<str id="voicesAudio">Ficheiro das Vozes</str>
<str id="importFrom">Importar de...</str>
<str id="importSource">Fonte de Importação:</str>
<str id="legacyOrPsych">Psych/Legacy FNF</str>
<str id="vslice">V-Slice</str>
<str id="vsliceProject">Projeto V-Slice (.fnfc)</str>
<str id="importChartFormat">Formato de Mapa</str>
<str id="importAudios">Adicionar Audios</str>
<str id="songFileName">Nome da canção $* Obrigatório$</str>
<str id="songDataFile">Ficheiro Dados/Mapa $* Obrigatório$</str>
<str id="songMetaFile">Ficheiro dos Metadados $* Obrigatório$</str>
<str id="back">Atrás</str>
<str id="next">Seguinte</str>
</group>
<group name="StrumlineOptions" prefix="charterStrumLine.">
<str id="characters">Personagens</str>
<str id="newChar">Nova Personagem</str>
<str id="type">Tipo</str>
<str id="scrollSpeed">Velocidade das Notas</str>
<str id="stagePos">Posição no Cenário</str>
<str id="scale">Tamanho</str>
<str id="spacing">Espaço</str>
<str id="hudPos">Posição HUD (X [Rácio 0-1],Y)</str>
<str id="visible">Visível?</str>
<str id="useChartScrollSpeed">Usa velocidade global?</str>
<str id="vocalSuffix">Sufixo Vocal</str>
<str id="keyCount">Número de Teclas</str>
</group>
<group name="ChartEditor" prefix="charter.">
<!-- Charter.hx -->
<group name="TopBar">
<str id="topBar.file">Ficheiro</str>
<group name="FileMenu" prefix="file.">
<str id="new">Novo</str>
<str id="save">Guardar</str>
<str id="saveAs">Guardar Como...</str>
<str id="saveGlobalEvents">Guardar Eventos Globais</str>
<str id="saveGlobalEventsAs">Guardar Eventos Globais Como...</str>
<str id="saveNoLocalEvents">Guardar Mapa sem Eventos Locais</str>
<str id="saveNoLocalEventsAs">Guardar Mapa sem Eventos Locais Como...</str>
<str id="saveMeta">Guardar Metadados</str>
<str id="saveMetaAs">Guardar Metadados Como...</str>
<str id="exportFnfLegacy">Exportar Para FNF Legacy...</str>
<str id="exportPsych">Exportar Para Psych Engine...</str>
<str id="exit">Sair</str>
</group>
<str id="topBar.edit">Editar</str>
<group name="EditMenu" prefix="edit.">
<str id="undo">Desfazer</str>
<str id="redo">Refazer</str>
<str id="copy">Copiar</str>
<str id="paste">Colar</str>
<str id="cut">Cortar</str>
<str id="delete">Apagar</str>
</group>
<str id="topBar.chart">Mapa</str>
<group name="ChartMenu" prefix="chart.">
<str id="playtest">Testar</str>
<str id="playtestHere">Testar aqui</str>
<str id="playtestOpponent">Testar como oponente</str>
<str id="playtestOpponentHere">Testar como oponente aqui</str>
<str id="enableScripts">Ativar scripts durante teste</str>
<str id="editChartData">Editar dados do mapa</str>
<str id="editMetadata">Editar info. dos metadados</str>
</group>
<str id="topBar.view">Vista</str>
<group name="ViewMenu" prefix="view.">
<str id="zoomIn">Ampliar</str>
<str id="zoomOut">Diminuir</str>
<str id="resetZoom">Zoom Padrão</str>
<str id="showSectionsSeparator">Mostrar Separador de Secções</str>
<str id="showBeatsSeparator">Mostrar Separador de Batidas</str>
<str id="rainbowWaveforms">Ondas Arcoíris</str>
<str id="lowDetailWaveforms">Ondas de Baixo Detalhe</str>
<str id="scrollLeft">Deslocar à Esquerda</str>
<str id="scrollRight">Deslocar à Direita</str>
<str id="scrollReset">Repor Deslocamento</str>
</group>
<str id="topBar.song">Canção</str>
<group name="SongMenu" prefix="song.">
<str id="goStart">Voltar ao início</str>
<str id="goEnd">Avançar até o fim</str>
<str id="addOpponentCamera">Adicionar camera no Oponente</str>
<str id="addPlayerCamera">Adicionar camera no Jogador</str>
<str id="muteInst">Silenciar instrumental</str>
<str id="muteVoices">Silenciar vozes</str>
</group>
<group name="BookmarkMenu" prefix="bookmarks.">
<str id="addBookmarkHere">Adicionar Marcador Aqui</str>
<str id="editBookmarkList">Editar Lista de Marcadores</str>
<str id="goTo">Ir para "{0}"</str>
<str id="createBookmarkTitle">A Criar Marcador Novo...</str>
<str id="createBookmarkName">Nome do Marcador:</str>
<str id="createBookmarkColor">Cor do Marcador:</str>
<str id="editBookmarkListTitle">Lista de Marcadores</str>
<str id="editBookmarksTitle">Editar Marcador</str>
<str id="newBookmarkName">Novo Marcador</str>
</group>
<str id="topBar.note">Notas</str>
<group name="NoteMenu" prefix="note.">
<str id="addSustainLength">Alargar Nota</str>
<str id="subtractSustainLength">Encurtar Nota</str>
<str id="selectAll">Selecionar tudo</str>
<str id="selectMeasure">Selecionar medida</str>
<str id="editNoteTypesList">Editar Lista de Tipos de Nota</str>
</group>
<str id="topBar.snap">Ajustes</str>
<group name="SnapMenu" prefix="snap.">
<str id="increaseSnap">↑ Ajuste de Casa</str>
<str id="resetSnap">Repor Ajuste de Casa</str>
<str id="decreaseSnap">↓ Ajuste de Casa</str>
<str id="snap">Ajuste de Casa {0}x</str>
</group>
<str id="topBar.playback">Reprodução</str>
<group name="PlaybackMenu" prefix="playback.">
<str id="play">Tocar/Pausar</str>
<str id="speedRaise">↑ Velocidade {0}%</str>
<str id="speedReset">Repor Velocidade</str>
<str id="speedLower">↓ Velocidade {0}%</str>
<str id="sectionBack">Voltar uma secção</str>
<str id="sectionForward">Avançar uma secção</str>
<str id="sectionStart">Voltar ao ínicio da secção</str>
<str id="backStep">Voltar um passo</str>
<str id="forwardStep">Avançar um passo</str>
<str id="metronome">Metrónomo</str>
<str id="visualMetronome">Metrónomo visual</str>
</group>
</group>
<group name="NoteTypes" prefix="noteTypes.">
<str id="default">Nota Normal</str>
</group>
<group name="EventTypes" prefix="events.">
<!-- You can add your custom event types here! -->
<!-- Just need to do some conversion from the raw name to the id -->
<!-- Example: HScript Call -> hscriptCall -->
<!-- Example: Change Character -> changeCharacter -->
<str id="hscriptCall">Chamar HScript</str>
<str id="cameraMovement">Mover Câmara</str>
<str id="cameraPosition">Posição da Câmara</str>
<str id="addCameraZoom">Adicionar Zoom</str>
<str id="cameraModuloChange">Mudar Pulso da Câmara</str>
<str id="cameraFlash">Flash da Câmara</str>
<str id="bpmChange">Mudar BPM</str>
<str id="continuousBpmChange">Mudança contínua de BPM</str>
<str id="timeSignatureChange">Mudar Compasso</str>
<str id="scrollSpeedChange">Mudança de Velocidade das Notas</str>
<str id="altAnimationToggle">Animações Alternativas</str>
<str id="playAnimation">Reproduzir Animação</str>
</group>
<group name="StrumlineOptions" prefix="strumLine.">
<str id="button-name">Opções ↓</str>
<str id="hitsounds">Som ao Bater</str>
<str id="muteVocals">Silenciar Voz</str>
<str id="edit">Editar</str>
<str id="delete">Apagar</str>
<str id="noWaveform">Sem onda</str>
</group>
<str id="createNew">Criar Nova</str>
<str id="lock-unlock">Trancar/\nDestrancar</str>
<str id="info.localEvents">Eventos Locais\n(Apenas Esta Dificuldade)</str>
<str id="info.globalEvents">Eventos Globais\n(Todas as Dificuldades)</str>
<str id="eventType-local">Evento Local</str>
<str id="eventType-global">Evento Global</str>
<!-- CharterEventAdd.hx -->
<str id="addEvent">Adicionar Evento</str>
<str id="editEvent">Editar Evento</str>
<str id="deleteEvent">Apagar Evento</str>
<group name="Notifications" prefix="popup.">
<str id="savedChartAt">Mapa Guardado em {0}!</str>
</group>
</group>
</group>
<group name="CharacterEditor">
<group name="CharacterSelection" prefix="characterSelection.">
<str id="acceptFolder">Carregue em ACEITAR para editar esta pasta.</str>
<str id="acceptCharacter">Carregue em ACEITAR para editar esta personagem.</str>
<str id="newCharacter">Nova Personagem</str>
<str id="newCharacterDesc">Carregue em ACEITAR para criar uma personagem nova.</str>
<str id="desc">Selecione uma personagem para editar</str>
<str id="desc-folder">Selecione uma personagem para editar em {0}</str>
</group>
<group name="CharacterInfoScreen" prefix="characterInfoScreen.">
<str id="win-title">A Editar Personagem</str>
<str id="title">Editar Info. da Personagem</str>
<str id="icon">Ícone</str>
<str id="iconColor">Cor do Ícone</str>
<str id="singDuration">Duração de Canto</str>
<str id="useSingDuration">Usar Duração de Canto?</str>
<str id="customValues">Valores Especiais (Avançado)</str>
</group>
<group name="CharacterEditor" prefix="characterEditor.">
<group name="TopBar">
<str id="topBar.file">Ficheiro</str>
<group name="FileMenu" prefix="file.">
<str id="new">Novo</str>
<str id="save">Guardar</str>
<str id="saveAs">Guardar Como...</str>
<str id="exit">Sair</str>
</group>
<str id="topBar.edit">Editar</str>
<group name="EditMenu" prefix="edit.">
<str id="copyOffset">Copiar Posição</str>
<str id="pasteOffset">Colar Posição</str>
<str id="undo">Desfazer</str>
<str id="redo">Refazer</str>
<str id="editInfo">Editar informação</str>
<str id="editSprite">Editar imagem fonte</str>
</group>
<str id="topBar.offset">Posição</str>
<group name="OffsetsMenu" prefix="offset.">
<str id="moveLeft">Mover Para a Esquerda</str>
<str id="moveUp">Mover Para Cima</str>
<str id="moveDown">Mover Para Baixo</str>
<str id="moveRight">Mover Para a Direita</str>
<str id="moveExtraLeft">Mover Mais Para a Esquerda</str>
<str id="moveExtraUp">Mover Mais Para Cima</str>
<str id="moveExtraDown">Mover Mais Para Baixo</str>
<str id="moveExtraRight">Mover Mais Para a Direita</str>
<str id="dragOffsetsMouse">Arrastar Posição Com o Rato?</str>
<str id="clearOffsets">Limpar Posições</str>
</group>
<str id="topBar.stage">Cenário</str>
<group name="StageMenu" prefix="stage.">
<str id="useStage">Usar "{0}"</str>
<str id="useNone">Não Usar Cenário</str>
</group>
<str id="topBar.view">Vista</str>
<group name="ViewMenu" prefix="view.">
<str id="zoomIn">Ampliar</str>
<str id="zoomOut">Diminuir</str>
<str id="resetZoom">Zoom Padrão</str>
<str id="charHitbox">"Hitbox" da Personagem?</str>
<str id="charCam">Câmara da Personagem?</str>
<str id="axis">Eixo XY?</str>
</group>
<str id="topBar.animation">Animação</str>
<group name="AnimationMenu" prefix="animation.">
<str id="playAnim">Reproduzir Animação</str>
<str id="stopAnim">Parar Animação</str>
<str id="changeAnimUp">Mudar Animação ↑</str>
<str id="changeAnimDown">Mudar Animação ↓</str>
<str id="playAnimOnOffset">Reproduzir Animação Reposicionada?</str>
</group>
<group name="CharacterPropertiesWindow" prefix="characterProperties.">
<str id="position">Posição (X, Y)</str>
<str id="scale">Tamanho</str>
<str id="editInfo">Editar Info.</str>
<str id="editSprite">Editar Imagem</str>
<str id="camPosition">Posição da Câmara (X, Y)</str>
<str id="charFlipped">Espelhado?</str>
<str id="antialiased">Suavizado?</str>
<str id="testCharAs">Testar Como...</str>
<str id="charDesign">Desenhada Como...</str>
</group>
<group name="CharacterAnimButton" prefix="characterAnim.">
<str id="defaultAnimName">Nova Animação</str>
<str id="name">Nome</str>
<str id="anim">Animação</str>
<str id="position">Posição (X, Y)</str>
<str id="fps">FPS</str>
<str id="indices">Índices (Frames)</str>
</group>
<group name="CharacterSpriteScreen" prefix="characterSpriteScreen.">
<str id="win-title">Editar imagem da personagem</str>
<str id="charImageFile">Imagem da personagem $* Obrigatório$</str>
</group>
</group>
</group>
<group name="CharacterCreationScreen" prefix="characterCreationScreen.">
<str id="win-title">A Criar uma Personagem Nova</str>
<str id="charName">Nome da Personagem $* Required$</str>
<str id="charImgName">Imagem $* Obrigatória$</str>
<group name="Warnings" prefix="warnings.">
<str id="char-exists-title">Criação da Personagem: Erro!</str>
<str id="char-exists-body">A personagem que está a tentar criar já existe, se quiser substituir apague a personagem primeiro!</str>
</group>
</group>
</group>
<group name="AlphabetEditor" prefix="editor.alphabet.">
<group name="AlphabetSelection" prefix="selection.">
<str id="acceptTypeface">Carregue em ACEITAR para editar este tipo de letra.</str>
<str id="newTypeface">Novo Tipo de Letra</str>
<str id="newTypefaceDesc">Carregue em ACEITAR para criar um tipo de letra novo.</str>
<str id="desc">Selecione um tipo de letra para editar</str>
<group name="Warnings" prefix="warnings.">
<str id="notImplemented-title">Novo Tipo de Letra: Função Não Implementada!</str>
<str id="notImplemented-body">Esta função ainda não foi implementada. Por favor espere por mais atualizações até ser implementada.\n\n\n- Codename Crew (Equipa Codename)</str>
</group>
</group>
<group name="AlphabetEditor">
<group name="TopBar">
<str id="topBar.file">Ficheiro</str>
<group name="FileMenu" prefix="file.">
<str id="new">Novo</str>
<str id="save">Guardar</str>
<str id="saveAs">Guardar Como...</str>
<str id="exit">Sair</str>
</group>
<str id="topBar.edit">Editar</str>
<group name="EditMenu" prefix="edit.">
<str id="undo">Desfazer</str>
<str id="redo">Refazer</str>
</group>
<str id="topBar.glyph">Glifo</str>
<group name="GlyphMenu" prefix="glyph.">
<str id="newGlyph">Novo Glifo</str>
<str id="editGlyph">Editar Glifo</str>
<str id="deleteGlyph">Apagar Glifo</str>
<str id="deleteCurGlyph">Apagar Glifo Atual</str>
</group>
<str id="topBar.offset">Posição</str>
<group name="OffsetsMenu" prefix="offset.">
<str id="moveLeft">Mover Para a Esquerda</str>
<str id="moveUp">Mover Para Cima</str>
<str id="moveDown">Mover Para Baixo</str>
<str id="moveRight">Mover Para a Direita</str>
<str id="moveExtraLeft">Mover Mais Para a Esquerda</str>
<str id="moveExtraUp">Mover Mais Para Cima</str>
<str id="moveExtraDown">Mover Mais Para Baixo</str>
<str id="moveExtraRight">Mover Mais Para a Direita</str>
<str id="clearOffsets">Limpar Posições</str>
</group>
<str id="topBar.view">Vista</str>
<group name="ViewMenu" prefix="view.">
<str id="zoomIn">Ampliar</str>
<str id="zoomOut">Diminuir</str>
<str id="resetZoom">Zoom Padrão</str>
</group>
</group>
</group>
</group>
<group name="StageEditor">
<group name="StageSelection" prefix="stageSelection.">
<str id="desc">Selecione um cenário para editar. Cenários HSCRIPT PURO não são suportadas.</str>
<str id="acceptStage">Carregue em ACEITAR para editar este cenário.</str>
<str id="newStage">Novo Cenário</str>
<str id="acceptNewStage">Carregue em ACEITAR para criar um cenário novo.</str>
</group>
<group name="StageEditor" prefix="stageEditor.">
<group name="TopBar">
<str id="topBar.file">Ficheiro</str>
<group name="FileMenu" prefix="file.">
<str id="save">Guardar</str>
<str id="saveAs">Guardar Como...</str>
<str id="exit">Sair</str>
</group>
<str id="topBar.edit">Editar</str>
<group name="EditMenu" prefix="edit.">
<str id="undo">Desfazer</str>
<str id="redo">Refazer</str>
<str id="editStageInfo">Editar Info. do Cenário</str>
</group>
<str id="topBar.select">Seleção</str>
<group name="SelectionMenu" prefix="select.">
<str id="all">Selecionar Tudo</str>
<str id="deselect">Desselecionar</str>
<str id="inverse">Inverter Seleção</str>
</group>
<str id="topBar.view">Vista</str>
<group name="ViewMenu" prefix="view.">
<str id="zoomIn">Ampliar</str>
<str id="zoomOut">Diminuir</str>
<str id="zoomReset">Zoom Padrão</str>
<str id="focusDad">Focar no Oponente</str>
<str id="focusGF">Focar em GF</str>
<str id="focusBF">Focar em BF</str>
</group>
<str id="topBar.editor">Editor</str>
<group name="EditorMenu" prefix="editor.">
<str id="showCharacters">Mostrar Personagens</str>
</group>
<group name="StageSpriteScreen" prefix="stageSpriteScreen.">
<str id="win-title">Editar imagem do cenário </str>
<str id="stageImageFile">Imagem do Cenário $* Obrigatória$</str>
</group>
</group>
</group>
<group name="StageCreationScreen" prefix="stageCreationScreen.">
<str id="win-title">A Criar um Cenário Novo</str>
<str id="title">Info. do Cenário</str>
<str id="stageName">Nome do Cenário</str>
<str id="stagePath">Caminho do Cenário</str>
<group name="Warnings" prefix="warnings.">
<str id="stage-exists-title">Criação de Cenário: Erro!</str>
<str id="stage-exists-body">O cenário que está a tentar criar já existe, se quiser substituir apague o cenário primeiro!</str>
</group>
</group>
<group name="StageInfoScreen" prefix="stageInfoScreen">
<str id="win-title">A Editar Info. do Cenário: "{0}"</str>
<str id="title">Info. do Cenário</str>
<str id="stageName">Nome do Cenário</str>
<str id="spritePath">Caminho do Sprite\n(Requer Recarregamento)</str>
<str id="startCamPos">Posição inicial da Câmara (X, Y)</str>
<str id="zoom">Zoom</str>
<str id="customAttributes">Atributos Especiais</str>
</group>
<group name="StageElementEditScreen" prefix="stageElementEditScreen.">
<str id="win-character-title">A Editar Personagem: "{0}"</str>
<str id="win-sprite-title">A Editar Sprite: "{0}"</str>
<str id="win-title">A Editar XML &lt;{0} /&gt;</str>
<str id="character-title">Dados da Personagem</str>
<str id="sprite-title">Dados do Sprite</str>
<str id="title">Dados do XML</str>
<str id="elementName">Nome do Elemento</str>
<str id="nameID">Nome Identificador</str>
<str id="imageFile">Imagem (WIP: precisa recarregar)\nEm (${stage.spritesParentFolder})</str>
<str id="scroll">Scroll {0}</str> <!-- it's "scroll" here because "deslocamento" is too big -->
<str id="scale">Tamanho {0}</str>
<str id="camera">Câmara {0}</str>
<str id="spacing">Espaçamento (X, Y)</str>
<str id="skew">Incline {0}</str>
<str id="alpha">Opacidade</str>
<str id="angle">Angulo</str>
<str id="zoomFactor">Fator de Zoom</str> <!-- same as for scroll, "fator de ampliação" took too much space -->
<str id="positionName">Nome de Posição</str>
<str id="flipX">Espelhar X</str>
<str id="antialiasing">"Antialiasing"</str>
<str id="highMemory">Alta Memória</str>
<str id="lowMemory">Baixa Memória</str>
<str id="attributes">Atributos</str>
<str id="transformPreview">Pré-visualização:</str>
<str id="animations">Animações</str>
<str id="animType">Tipo de Animação</str>
<group name="AnimTypeDropdown" prefix="animType.">
<str id="none">NENHUM</str>
<str id="beat">EM BATIDA</str>
<str id="loop">REPETIR</str>
</group>
<str id="tipCustomProperties">Dica: Para aceder a mais dados,\nSegure em Shift quando Editar</str>
</group>
<group name="StageXMLEditScreen" prefix="stageXMLEditScreen.">
<str id="win-title">A Editar XML de {0}</str>
<str id="title">Dados do XML</str>
<str id="attributes">Atributos</str>
</group>
<str id="stageCharacters.requiredPosition">Esta posição é necessária em cenários!</str>
<str id="stageCharacters.noDeleteGirlfriend">Não pode apagar a Girlfriend</str>
<group name="StageElement" prefix="stageElement.">
<str id="scale">Tamanho: {0}, {1}</str>
<str id="scroll">Deslocamento: {0}, {1}</str>
</group>
<group name="StageSprites" prefix="stageSprites.">
<str id="win-title">Sprites do Cenário</str>
<str id="sprite">Sprite</str>
<str id="box">Caixa</str>
<str id="character">Personagem</str>
<str id="warnings.not-implemented">Criar caixas ainda não foi implementado!</str>
</group>
</group>
<group name="PlayTesting" prefix="playtesting.">
<str id="chartPlaytesting" notrim="true"> (Teste de mapa)</str>
<str id="exitGame">Sair do Jogo</str>
<str id="exitToMenu">Sair Para Menu</str>
<str id="saveAndExitGame">Guardar e Sair do Jogo</str>
<str id="saveAndExitToMenu">Guardar e Sair Para Menu</str>
<str id="cancel">Cancelar</str>
<str id="warningTitle">MUDANÇAS NÃO GUARDADAS!</str>
<str id="warningDesc">Quaisquer mudanças serão *perdidas* se não as guardar. (Não serão recuperáveis)\n\n\nGostaria de Cancelar?</str>
</group>
<group name="SaveWarning" prefix="saveWarning.">
<str id="warningTitle">Mudanças não guardadas!</str>
<str id="warningDesc">Quaisquer mudanças serão perdidas se não as guardar. (Não serão recuperáveis)\n\n\nGostaria de Cancelar?</str>
<str id="exitGame">Sair do Jogo</str>
<str id="exitToMenu">Sair Para Menu</str>
<str id="saveAndExitGame">Guardar e Sair do Jogo</str>
<str id="saveAndExitToMenu">Guardar e Sair Para Menu</str>
<str id="cancel">Cancelar</str>
</group>
<group name="ModConfigWarning" prefix="modConfigWarning.">
<str id="warningTitle">Configuração da pasta do mod em falta!</str>
<str id="warningDesc">Está a faltar um ficheiro de configurações ao seu mod!\n\nGostaria de criar um automaticamente?\n\n(PS: Se este mod não for seu, por favor desative o Modo de desenvolvedor para fazer esta notificação parar de aparecer.)</str>
<str id="createdTitle">Config. de mod criada!</str>
<str id="createdDesc">As configurações do seu mod foram criadas em {0}!</str>
</group>
</language>
+104
View File
@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8" ?>
<language>
<group name="PlayState">
<str id="game.score">Pontos:{0}</str>
<str id="game.misses">Erros:{0}</str>
<str id="game.comboBreaks">Quebras de Combo:{0}</str>
<str id="game.accuracy">Precisão:{0} - {1}</str>
<str id="game.combo">Combo:{0}</str>
<str id="game.rating.[N/A]">[N/A]</str>
<str id="game.rating.F">F</str>
<str id="game.rating.E">E</str>
<str id="game.rating.D">D</str>
<str id="game.rating.C">C</str>
<str id="game.rating.B">B</str>
<str id="game.rating.A">A</str>
<str id="game.rating.S">S</str>
<str id="game.rating.S++">S++</str>
</group>
<group name="StoryMenu">
<str id="story.score">PONTUAÇÃO DA SEMANA:{0}</str>
<str id="story.tracks">FAIXAS</str>
</group>
<group name="Freeplay">
<str id="freeplay.score">RECORDE PESSOAL:{0}</str>
<str id="freeplay.solo">Solo</str>
<str id="freeplay.opponentMode">Modo Oponente</str>
<str id="freeplay.coopMode">Modo Co-Op</str>
<str id="freeplay.coopModeSwitched">Modo Co-Op (Trocado)</str>
</group>
<group name="Pause">
<group name="PauseOptions">
<str id="pause.resume">Continuar</str>
<str id="pause.restartSong">Recomeçar Canção</str>
<str id="pause.changeControls">Mudar Controlos</str>
<str id="pause.changeOptions">Opções</str>
<str id="pause.exitToMenu">Sair para menu</str>
<str id="pause.exitToCharter">Sair para editor</str>
<str id="pause.resumeCutscene">Resumir Cena</str>
<str id="pause.skipCutscene">Saltar Cena</str>
<str id="pause.restartCutscene">Recomeçar Cena</str>
</group>
<str id="pause.deathCounter">Tomates azuis: {0}</str>
<str id="pause.coopMode">MODO CO-OP</str>
<str id="pause.opponentMode">MODO OPONENTE </str>
</group>
<group name="Credits">
<group name="CreditsCodename">
<str id="credits.mainDev" notrim="true"> *- Membro público dos Desenvolvedores!*</str>
<str id="credits.totalContributions">Contribuições Totais: ~{0}~ / *{1}* (~{2}%~) - Selecione para abrir a sua conta GitHub</str>
<str id="credits.downloadingList">A Descarregar Lista...</str>
<str id="credits.allContributors">Todos os contribuidores! Carregue em REINICIAR para atualizar a lista (Uma vez a cada 2 minutos).</str>
</group>
<group name="CreditsMain">
<str id="credits.name">Créditos</str>
<str id="credits.madePossible">As pessoas que fizeram isto possível!</str>
<str id="credits.selectCodename">Selecione isto para ver todos os contribuidores de Codename Engine!</str>
<str id="credits.selectBase">Selecione isto para abrir a página itch.io do jogo original para doar!</str>
</group>
</group>
<group name="Mods">
<str id="mods.disableMods">Desativar Mods</str>
</group>
<group name="MainMenu">
<str id="mainMenu.commit">Commit: {0} ({1})</str>
<str id="mainMenu.openMods">[{0}] Abrir menu de mods</str>
</group>
<group name="Updater">
<group name="UpdateAvailable">
<str id="updateAvailable.title">NOVA ATUALIZAÇÃO</str>
<str id="updateAvailable.install">INSTALAR</str>
<str id="updateAvailable.skip">SALTAR</str>
</group>
<group name="UpdateScreen">
<str id="updateScreen.general-1">A Preparar a instalação...</str>
<str id="updateScreen.part-1">A Criar a pasta de instalação e a limpar ficheiros antigos...</str>
<str id="updateScreen.general-2">A Transferir ficheiros...</str>
<str id="updateScreen.part-2">A Transferir ficheiro {0}</str>
<str id="updateScreen.general-3">A transferir executável novo...</str>
<str id="updateScreen.part-3">A Transferir {0}</str>
<str id="updateScreen.general-4">A instalar ficheiros novos...</str>
<str id="updateScreen.part-4">A Instalar {0}</str>
</group>
</group>
<group name="Difficulties">
<str id="diff.easy">Fácil</str>
<str id="diff.normal">Normal</str>
<str id="diff.hard">Difícil</str>
<str id="diff.erect">Ereto</str>
<str id="diff.nightmare">Pesadelo</str>
</group>
</language>
+207
View File
@@ -0,0 +1,207 @@
<?xml version="1.0" encoding="utf-8" ?>
<language>
<str id="optionsMenu.desc-missing">Sem descrição</str>
<group name="OptionsMenu">
<str id="optionsMenu.advanced">Avançado</str>
<str id="optionsMenu.header.title">Opções</str>
<str id="optionsMenu.header.desc">Selecione uma categoria para continuar.</str>
<str id="optionsTree.controls-name">Controlos</str>
<str id="optionsTree.controls-desc">Mude os Controlos para Jogador 1 e Jogador 2!</str>
<str id="optionsTree.gameplay-name">Jogo</str>
<str id="optionsTree.gameplay-desc">Mude as opções como "Downscroll", Velocidade das notas, Indecência...</str>
<str id="optionsTree.gameplay.advanced-desc">Mude as opções mais avançadas como Transmissão de áudio...</str>
<str id="optionsTree.appearance-name">Aparência</str>
<str id="optionsTree.appearance-desc">Mude as opções de aparência como Luzes intermitentes...</str>
<str id="optionsTree.appearance.advanced-desc">Mude as opções mais avançadas como Sprites apenas em VRAM, "Antialiasing", "Shaders"</str>
<str id="optionsTree.language-name">Idioma</str>
<str id="optionsTree.language-desc">Mude o idioma que o jogo usa.</str>
<str id="optionsTree.miscellaneous-name">Outras</str>
<str id="optionsTree.miscellaneous-desc">Use este menu para apagar dados ou definições.</str>
<str id="optionsTree.debug-name">Opções de Depuração</str>
<str id="optionsTree.debug-desc">Opções de Depuração para o Modo de Desenvolvedor.</str>
</group>
<group name="KeybindOptions" prefix="KeybindsOptions.">
<str id="left">Esquerda</str>
<str id="down">Baixo</str>
<str id="up">Cima</str>
<str id="right">Direita</str>
<str id="category.notes">Notas</str>
<str id="category.ui">Interface</str>
<group name="ui" prefix="ui.">
<str id="accept">Aceitar</str>
<str id="back">Cancelar</str>
<str id="reset">Reiniciar</str>
<str id="pause">Pausa</str>
<str id="changeMode">Mudar Modo</str>
</group>
<str id="category.engine">Codename Engine</str>
<group name="engine" prefix="engine.">
<str id="switchMod">Trocar Mod</str>
</group>
<str id="category.volume">Volume</str>
<str id="volume.up">Subir</str>
<str id="volume.down">Baixar</str>
<str id="volume.mute">Silenciar</str>
<str id="category.developer">Desenvolvedor</str>
<group name="developer" prefix="developer.">
<str id="devMenus">Menus Dev.</str>
<str id="openConsole">Consola</str>
<str id="reloadState">Recarregar</str>
</group>
</group>
<group name="AppearanceOptions" prefix="AppearanceOptions.">
<str id="framerate-name">FPS</str>
<str id="framerate-desc">Quadros Por Segundo, se quiser. Explica-se a sí próprio, certo?</str>
<str id="flashingMenu-name">Luzes Intermitentes</str>
<str id="flashingMenu-desc">Se desmarcado, irá desativar as luzes intermitentes quando seleciona algo no Menu Principal, e outras serão abrandadas.</str>
<str id="colorHealthBar-name">Barra de Vida Colorida</str>
<str id="colorHealthBar-desc">Se desmarcado, o jogo irá usar a barra vermelha/verde de versões FNF pré-semana 7.</str>
<str id="week6PixelPerfect-name">Efeito "Pixel Perfect"</str>
<str id="week6PixelPerfect-desc">se marcado, a Semana 6 ou outros cenários "pixel" terão um efeito "pixel perfect", alinhando todos os pixeis ao ecrã.</str>
<group name="AppearanceOptionsAdvanced" prefix="Advanced.">
<str id="quality-name">Qualidade</str>
<str id="quality-desc">Modos de qualidade para escolher, "BAIXA" = Desativa todos os efeitos visuais pesados para um jogo mais suave, "ALTA" = Ativa todos os efeitos visuais, ao custo do desempenho, "CUSTOMIZADA" = Permite opções especiais, disponíveis em "Advançado".</str>
<str id="quality-low">BAIXA</str>
<str id="quality-high">ALTA</str>
<str id="quality-custom">CUSTOMIZADA</str>
<str id="antialiasing-name">"Antialiasing"</str>
<str id="antialiasing-desc">Se desmarcado, irá remover "antialiasing" a todos os sprites. Poderá aumentar o desempenho ao custo de sprites menos suaves.</str>
<str id="lowMemoryMode-name">Memória baixa</str>
<str id="lowMemoryMode-desc">Se marcado, irá remover certos elementos de fundo para reduzir o uso de memória.</str>
<str id="gameplayShaders-name">"Shaders"</str>
<str id="gameplayShaders-desc">If desmarcado, "Shaders" (efeitos visuais como a Aberração cromática de "Thorns") não serão carregadas; poderá ser útil em dispositivos fracos.</str>
<str id="gpuOnlyBitmaps-name">Sprites só em VRAM</str>
<str id="gpuOnlyBitmaps-desc">Se marcado, irá apenas guardar os bitmaps na GPU, libertando IMENSA memória (EXPERIMENTAL). Desmarcar isto irá consumir muita memória, especialmente em sprites maiores. Se não tiver a certeza, deixe isto marcado.</str>
</group>
</group>
<group name="GameplayOptions" prefix="GameplayOptions.">
<str id="downscroll-name">"Downscroll"</str>
<str id="downscroll-desc">Se marcado, notas irão de cima para baixo em vez de baixo para cima, como se estivessem a cair.</str>
<str id="ghostTapping-name">Toques Fantasma</str>
<str id="ghostTapping-desc">Se desmarcado, bater em teclas que não tem uma nota conta como erro.</str>
<str id="naughtyness-name">Indecência</str>
<str id="naughtyness-desc">Se desmarcado, irá censurar as cenas da Semana 7, ou mais.</str>
<str id="camZoomOnBeat-name">Zoom na Batida</str>
<str id="camZoomOnBeat-desc">Se desmarcado. irá parar a câmara de ampliar a cada 4 batidas.</str>
<str id="autoPause-name">Auto Pausa</str>
<str id="autoPause-desc">Se marcado, mudar de janela pausará o jogo.</str>
<str id="volumeMusic-name">Volume da Música</str>
<str id="volumeMusic-desc">Muda apenas o volume da música em vez de tudo.</str>
<str id="volumeSFX-name">Volume dos SFX</str>
<str id="volumeSFX-desc">Muda apenas o volume dos efeitos sonoros em vez de tudo.</str>
<str id="songOffset-name">Atraso da Música</str>
<str id="songOffset-desc">Muda a posição da música relativamente às notas.</str>
<group name="GameplayOptionsAdvanced" prefix="Advanced.">
<str id="windowSize-name">Tamanho da Janela</str>
<str id="windowSize-desc">...</str>
<str id="streamedMusic-name">Transmissão de Música</str>
<str id="streamedMusic-desc">Se marcado, músicas serão transmitidas enquanto tocam, libertando IMENSA memória com o custo de maior uso de CPU se mais sons estiverem a ser transmitidos ao mesmo tempo (EXPERIMENTAL). Desmarcar isto irá consumir muita memória, especialmente em músicas maiores. Se não tiver a certeza, deixe marcado.</str>
<str id="streamedVocals-name">Transmissão de Vozes</str>
<str id="streamedVocals-desc">Se marcado, vozes também serão transmitidas enquanto tocam se "Transmissão de Música" estiver ativada. Irá impactar o desempenho se a canção usar muitas vozes (EXPERIMENTAL). Se não tiver a certeza, deixe marcado.</str>
</group>
</group>
<group name="LanguageOptions" prefix="LanguageOptions.">
<str id="language-name">Idioma</str>
<str id="language-desc">Idioma por {0} (Versão: {1})</str>
</group>
<group name="MiscOptions" prefix="MiscOptions.">
<str id="forceCrash-name">Forçar "Crash"</str>
<str id="forceCrash-desc">Selecione esta opção para forçar o jogo a encravar e travar.</str>
<str id="betaUpdates-name">Atualizações "Nightly"</str>
<str id="betaUpdates-desc">Se marcado, também irá incluir versões "nightly" (a versão mais recente disponível no repositório de GitHub) na verificação de atualizações.</str>
<str id="checkForUpdates-name">Verificar Atualizações</str>
<str id="checkForUpdates-desc">Selecione esta opção para verificar se existem atualizações novas.</str>
<str id="checkForUpdates-noUpdateFound">Nenhuma atualização encontrada.</str>
<str id="devMode-name">Modo Desenvolvedor</str>
<str id="devMode-desc">Se marcado, irá poder aceder funções de desenvolvedor como certas teclas, editores, opções de desenvolvedor, recarregamento de estados, consola e mais.</str>
<str id="allowConfigWarning-name">Aviso de Modpacks</str>
<str id="allowConfigWarning-desc">Se marcado, um aviso no início do jogo aparecerá se houver problemas com o modpack, como configurações em falta, versões incompatíveis e mais.</str>
<str id="resetSaveData-name">Apagar Dados</str>
<str id="resetSaveData-desc">Selecione esta opção para apagar todos os dados. Isto irá remover todos os seus recordes.</str>
</group>
<group name="DebugOptions" prefix="DebugOptions.">
<str id="title">Opções de Depuração</str>
<str id="desc">Use este menu para ativar ou desativar opções de depuração.</str>
<str id="showConsole-name">Mostrar Consola</str>
<str id="showConsole-desc">Selecione isto para mostrar a consola, que contém registos acerca do jogo.</str>
<str id="editorsResizable-name">Editores Adaptáveis</str>
<str id="editorsResizable-desc">Se marcado, irá permitir que os editores utilizem resoluções acima da base 1280x720 de FNF (permitindo mais detalhe e espaço...)</str>
<str id="bypassEditorsResize-name">Sem Tamanho Mínimo</str>
<str id="bypassEditorsResize-desc">Desativa o limite de resolução minimo dos editores (Requer que "Editores Adaptáveis" esteja marcado).</str>
<str id="editorSFX-name">Sons de Editor</str>
<str id="editorSFX-desc">Se marcado, tocará efeitos sonoros nos editores (ex: ao carregar em caixas...)</str>
<str id="editorCharterPrettyPrint-name">Mapas Legíveis</str>
<str id="editorCharterPrettyPrint-desc">Se marcado, os ficheiros guardados no editor de mapas serão formatados para serem fácilmente legíveis.</str>
<str id="editorCharacterPrettyPrint-name">Personagens Legíveis</str>
<str id="editorCharacterPrettyPrint-desc">Se marcado, os ficheiros guardados no editor de personagens serão formatados para serem fácilmente legíveis.</str>
<str id="editorStagePrettyPrint-name">Cenários Legíveis</str>
<str id="editorStagePrettyPrint-desc">Se marcado, os ficheiros guardados no editor de cenários serão formatados para serem fácilmente legíveis.</str>
<str id="intensiveBlur-name">Desfoque Intensivo</str>
<str id="intensiveBlur-desc">Se marcado, irá usar um desfoque mais intensivo. Parece melhor, mas poderá ser mais lento.</str>
<str id="charterAutoSaves-name">Gravação Automática</str>
<str id="charterAutoSaves-desc">Se marcado, irá guardar ficheiros de editor automáticamente, com as definições listadas abaixo.</str>
<str id="charterAutoSaveTime-name">Tempo de Gravação</str>
<str id="charterAutoSaveTime-desc">Isto controla com que frequência o editor gravará o ficheiro (em segundos...)</str>
<str id="charterAutoSaveWarningTime-name">Tempo de Aviso</str>
<str id="charterAutoSaveWarningTime-desc">Isto controla com que antecedência o editor irá avisá-lo antes de guardar (em segundos..., 0 para desativar)</str>
<str id="charterAutoSavesSeparateFolder-name">Pasta de Gravações</str>
<str id="charterAutoSavesSeparateFolder-desc">Se marcado, irá guardar os ficheiros numa pasta separada com a data em vez de substituir o ficheiro atual. (song/autosaves/)</str>
<str id="songOffsetAffectEditors-name">Atraso no Mapeador</str>
<str id="songOffsetAffectEditors-desc">Se marcado, irá ativar o Atraso da Música no Editor de Mapas, também.</str>
</group>
</language>
+3
View File
@@ -0,0 +1,3 @@
name="Português"
credits="Bitto1070"
version="1.0.0"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 KiB

@@ -1,60 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Created with Funkin Packer v0.1.3 https://neeeoo.github.io/funkin-packer/
-->
<TextureAtlas imagePath="titleEnter.png" width="1258" height="1991">
<SubTexture name="ENTER PRESSED0001" x="1" y="1" width="1256" height="73" frameX="-105" frameY="-0" frameWidth="1478" frameHeight="78"/>
<SubTexture name="ENTER PRESSED0002" x="1" y="77" width="1256" height="73" frameX="-105" frameY="-0" frameWidth="1478" frameHeight="78"/>
<SubTexture name="ENTER PRESSED0003" x="1" y="1" width="1256" height="73" frameX="-105" frameY="-0" frameWidth="1478" frameHeight="78"/>
<SubTexture name="ENTER PRESSED0004" x="1" y="77" width="1256" height="73" frameX="-105" frameY="-0" frameWidth="1478" frameHeight="78"/>
<SubTexture name="ENTER PRESSED0005" x="1" y="1" width="1256" height="73" frameX="-105" frameY="-0" frameWidth="1478" frameHeight="78"/>
<SubTexture name="ENTER PRESSED0006" x="1" y="77" width="1256" height="73" frameX="-105" frameY="-0" frameWidth="1478" frameHeight="78"/>
<SubTexture name="ENTER PRESSED0007" x="1" y="1" width="1256" height="73" frameX="-105" frameY="-0" frameWidth="1478" frameHeight="78"/>
<SubTexture name="ENTER PRESSED0008" x="1" y="77" width="1256" height="73" frameX="-105" frameY="-0" frameWidth="1478" frameHeight="78"/>
<SubTexture name="Press Enter to Begin0001" x="1" y="153" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0002" x="1" y="233" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0003" x="1" y="313" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0004" x="1" y="393" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0005" x="1" y="473" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0006" x="1" y="553" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0007" x="1" y="633" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0008" x="1" y="713" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0009" x="1" y="793" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0010" x="1" y="873" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0011" x="1" y="953" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0012" x="1" y="1033" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0013" x="1" y="1113" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0014" x="1" y="1193" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0015" x="1" y="1273" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0016" x="1" y="1353" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0017" x="1" y="1433" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0018" x="1" y="1513" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0019" x="1" y="1593" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0020" x="1" y="1673" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0021" x="1" y="1753" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0022" x="1" y="1833" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0023" x="1" y="1913" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0024" x="1" y="1913" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0025" x="1" y="1833" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0026" x="1" y="1753" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0027" x="1" y="1673" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0028" x="1" y="1593" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0029" x="1" y="1513" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0030" x="1" y="1433" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0031" x="1" y="1353" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0032" x="1" y="1273" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0033" x="1" y="1193" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0034" x="1" y="1113" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0035" x="1" y="1033" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0036" x="1" y="953" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0037" x="1" y="873" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0038" x="1" y="793" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0039" x="1" y="713" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0040" x="1" y="633" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0041" x="1" y="553" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0042" x="1" y="473" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0043" x="1" y="393" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0044" x="1" y="313" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0045" x="1" y="233" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
<SubTexture name="Press Enter to Begin0046" x="1" y="153" width="1255" height="77" frameX="-112" frameY="-3" frameWidth="1494" frameHeight="96"/>
</TextureAtlas>
+29 -41
View File
@@ -1,19 +1,15 @@
import flixel.FlxSprite;
var tankmanRun:Array<TankmenBG> = [];
var grpTankmanRun:FlxTypedGroup<FlxSprite> = [];
var spawnTimes = []; // [[time, direction]]
var tankmanPool = [];
function recycleTankman() {
if(tankmanPool.length == 0) {
return new TankmenBG();
} else {
return tankmanPool.shift(); // can be pop but it causes it to be less random
}
var tankmanGroup:TankmenGroup = {
run: [],
pool: [],
group: new FlxTypedGroup<FlxSprite>()
}
function recycleTankman()
return tankmanGroup.pool.length == 0 ? new TankmenBG(tankmanGroup) : tankmanGroup.pool.shift(); // can be pop but it causes it to be less random
function getTankman(data:Array<Float>) {
var tankman:TankmenBG = recycleTankman();
tankman.strumTime = data[0];
@@ -22,9 +18,8 @@ function getTankman(data:Array<Float>) {
}
function postCreate() {
grpTankmanRun = new FlxTypedGroup();
insert(members.indexOf(gf) - 1, grpTankmanRun);
if(inCutscene) grpTankmanRun.visible = false;
insert(members.indexOf(gf) - 1, tankmanGroup.group);
if (inCutscene) tankmanGroup.group.visible = false;
/*var tempTankman:TankmenBG = recycleTankman();
tempTankman.strumTime = 10;
@@ -42,9 +37,8 @@ function postCreate() {
//spawnTimes.reverse(); // no need to reverse it since the notes are already reversed
}
function onStartCountdown() {
if(PlayState.instance.seenCutscene) grpTankmanRun.visible = true;
}
function onStartCountdown()
if (PlayState.instance.seenCutscene) tankmanGroup.group.visible = true;
function spawnTankmen() {
var time = Conductor.songPosition;
@@ -54,50 +48,46 @@ function spawnTankmen() {
//trace("Spawning Tankman", tankmen.sprite.offset, tankmen.goingRight);
tankmanRun.push(tankmen);
grpTankmanRun.add(tankmen.sprite);
tankmanGroup.run.push(tankmen);
tankmanGroup.group.add(tankmen.sprite);
}
}
function update(elapsed) {
spawnTankmen();
var length = tankmanRun.length;
for(i in 0...length) {
var length = tankmanGroup.run.length;
for (i in 0...length) {
var reverseIndex = length - i - 1;
var tankmen = tankmanRun[reverseIndex];
var tankmen = tankmanGroup.run[reverseIndex];
tankmen.update(elapsed);
}
}
class TankmenBG {
public var sprite:FlxSprite;
var strumTime = 0;
var goingRight = false;
var tankSpeed = 0.7;
var endingOffset = null;
var sprite = null;
var endingOffset:Float;
var killed = false;
var grp:TankmenGroup; // The reference to the current pool
function new() {
this.sprite = new FlxSprite();
var sprite = this.sprite;
function new(grp:TankmenGroup) {
this.grp = grp;
sprite = new FlxSprite();
sprite.frames = Paths.getSparrowAtlas('stages/tank/tankmanKilled1');
sprite.antialiasing = true;
sprite.animation.addByPrefix('run', 'tankman running', 24, true);
sprite.animation.play('run');
sprite.updateHitbox();
sprite.setGraphicSize(Std.int(sprite.width * 0.8));
sprite.updateHitbox();
}
function resetShit(x, y, isGoingRight) {
var sprite = this.sprite;
function resetShit(x:Float, y:Float, isGoingRight:Bool) {
sprite.revive();
sprite.setPosition(x, y);
sprite.offset.set(0, 0);
@@ -114,7 +104,6 @@ class TankmenBG {
}
function update(elapsed) {
var sprite = this.sprite;
sprite.visible = !(sprite.x >= FlxG.width * 1.5 || sprite.x <= FlxG.width * -0.5);
if (sprite.animation.curAnim.name == 'run')
@@ -124,8 +113,7 @@ class TankmenBG {
if (goingRight) {
endDirection = (FlxG.width * 0.02) - endingOffset;
sprite.x = (endDirection + (Conductor.songPosition - strumTime) * tankSpeed);
}
else sprite.x = (endDirection - (Conductor.songPosition - strumTime) * tankSpeed);
} else sprite.x = (endDirection - (Conductor.songPosition - strumTime) * tankSpeed);
}
if (Conductor.songPosition > strumTime)
@@ -133,10 +121,10 @@ class TankmenBG {
sprite.animation.play('shot');
sprite.animation.finishCallback = function(_) {
killed = true;
grpTankmanRun.remove(sprite, true);
grp.group.remove(sprite, true);
sprite.kill();
tankmanPool.push(this);
tankmanRun.remove(this);
grp.pool.push(this);
grp.run.remove(this);
}
if (goingRight)
@@ -146,4 +134,4 @@ class TankmenBG {
}
}
}
}
}
+40
View File
@@ -0,0 +1,40 @@
Here's the full guide on how to setup and compile Codename Engine!<br>
> **Open the instructions for your platform**
<details>
<summary>Windows</summary>
1. Install [version 4.3.7 of Haxe](https://haxe.org/download/version/4.3.7/).
2. Download and install [`git-scm`](https://git-scm.com/download/win).
- Leave all installation options as default.
3. Run `setup-windows.bat` using cmd or double-clicking it and wait for the libraries to install.
4. Once the libraries are installed, run `haxelib run lime test windows` to compile and launch the game (may take a long time)
- ℹ You can run `haxelib run lime setup` to make the lime command global, allowing you to execute `lime test windows` directly.
</details>
<details>
<summary>Linux</summary>
1. Install [version 4.3.7 of Haxe](https://haxe.org/download/version/4.3.7/).
2. Install `libvlc` if not present already.
- ℹ On certain Arch based distros installing `vlc-plugins-all` might solve if `libvlc` alone doesn't work.
3. Install `g++`, if not present already.
4. Download and install [`git-scm`](https://git-scm.com/download/linux) if not present already.
5. Run `setup-unix.sh` using the terminal or double-clicking it and wait for the libraries to install.
6. Once the libraries are installed, run `haxelib run lime test linux` to compile and launch the game (may take a long time)
- ℹ You can run `haxelib run lime setup` to make the lime command global, allowing you to execute `lime test linux` directly.
</details>
<details>
<summary>MacOS</summary>
1. Install [version 4.3.7 of Haxe](https://haxe.org/download/version/4.3.7/).
2. Install `Xcode` to allow C++ app building.
3. Download and install [`git-scm`](https://git-scm.com/download/mac).
4. Run `setup-unix.sh` using the terminal and wait for the libraries to install.
5. Once the libraries are installed, run `haxelib run lime test mac` to compile and launch the game (may take a long time)
- ℹ You can run `haxelib run lime setup` to make the lime command global, allowing you to execute `lime test mac` directly.
</details>
> [!TIP]
> You can also run `./cne-windows.bat -help` or `./cne-unix.sh -help` (depending on your platform) to check out more useful commands!<br>
> For example `./cne-windows test` or `./cne-unix.sh test` builds the game and uses the source assets folder instead of the export one for easier development (although you can still use `lime test` normally).
> - If you're running the terminal from the project's main folder, use instead `./building/cne-windows.bat -COMMAND HERE` or `./building/cne-unix.sh -COMMAND HERE` depending on your platform.
View File
+2
View File
@@ -1 +1,3 @@
#!/usr/bin/env sh
cd "$(dirname "$0")/.."
haxe -cp commandline -D analyzer-optimize --run Main $@
+1
View File
@@ -1 +1,2 @@
cd /d "%~dp0.."
@haxe -cp commandline -D analyzer-optimize --run Main %*
+2 -2
View File
@@ -5,7 +5,7 @@
<!-- OpenFL & Lime (Required for Flixel) -->
<git name="openfl" url="https://github.com/CodenameCrew/cne-openfl" />
<lib name="lime" version="8.1.2" />
<lib name="lime" version="8.2.0" />
<!-- <git name="lime" url="https://github.com/CodenameCrew/cne-lime" /> disabled for now until fixed -->
<!-- Flixel -->
@@ -16,7 +16,7 @@
<git name="hscript-improved" url="https://github.com/CodenameCrew/hscript-improved" ref="codename-dev" />
<git name="flxanimate" url="https://github.com/CodenameCrew/cne-flxanimate" />
<git name="hxdiscord_rpc" url="https://github.com/CodenameCrew/cne-hxdiscord_rpc" skipDeps="true" />
<git name="funkin-modchart" url="https://github.com/CodenameCrew/FunkinModchart" skipDeps="true" />
<git name="funkin-modchart" url="https://github.com/TheoDevelops/FunkinModchart" ref="f30676579d8de7ccac7d12e13b664e8b2c42c6bf" skipDeps="true" />
<lib name="hxvlc" version="1.9.3" skipDeps="true" />
<!-- Documentation and other features -->
+2 -1
View File
@@ -1,2 +1,3 @@
#!/bin/sh
#!/usr/bin/env sh
cd "$(dirname "$0")/.."
haxe -cp commandline -D analyzer-optimize --run Main setup
@@ -1 +1,2 @@
cd /d "%~dp0.."
@haxe -cp commandline -D analyzer-optimize --run Main setup
+2 -1
View File
@@ -16,7 +16,7 @@ class Main {
dDoc: [
"Usage: setup",
"",
"This command runs through all libraries in libs.xml, and install them.",
"This command runs through all libraries in building/libs.xml, and install them.",
"If they're already installed, they will be updated.",
"",
"--all : Reinstall all libraries.",
@@ -173,6 +173,7 @@ class Main {
Sys.println("Codename Engine Command Line utility");
Sys.println('Available commands (${commands.length}):\n');
for(line in commands) {
if(line.names.contains(null)) line.names.remove(null);
Sys.println('${line.names.join(", ")} - ${line.doc}');
}
}
+8 -8
View File
@@ -55,7 +55,7 @@ class Setup {
FileSystem.createDirectory('.haxelib');
}
var libFile = "./libs.xml";
var libFile = "./building/libs.xml";
if(args.existsOption("lib")) {
libFile = args.getOption("lib");
if(libFile == null) {
@@ -252,32 +252,32 @@ class Setup {
// check for outdated haxe
final curHaxeVer = [for(v in haxeVer.split(".")) Std.parseInt(v)];
final minumumVersion = [4, 2, 5];
final minumumVersion = [4, 3, 7];
for(i in 0...minumumVersion.length) {
if (curHaxeVer[i] > minumumVersion[i]) break;
if (curHaxeVer[i] < minumumVersion[i]) {
prettyPrint([
"!! WARNING !!",
"Your current Haxe version is outdated.",
'You\'re using ${haxeVer}, whilst the required version is 4.2.5 or newer.',
'You\'re using ${haxeVer}, whilst the required version is 4.3.7 or newer.',
'The engine may not compile with your current version of Haxe.',
'We recommend upgrading to 4.2.5 or newer'
'We recommend upgrading to 4.3.7 or newer'
].join("\n"));
break;
}
}
}
// vswhere.exe its used to find any visual studio related installations on the system, including full visual studio ide installations, visual studio build tools installations, and other related components - Nex
if (CHECK_VSTUDIO && Compiler.getBuildTarget().toLowerCase() == "windows" && new Process('"C:/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe" -property catalog_productDisplayVersion').exitCode(true) == 1) {
// vswhere.exe is used to find any visual studio related installations on the system, including full visual studio ide installations, visual studio build tools installations, and other related components - Nex
if (CHECK_VSTUDIO && Compiler.getBuildTarget().toLowerCase() == "windows" && new Process('"C:/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -requires Microsoft.VisualStudio.Component.Windows10SDK.19041 -property installationPath').exitCode(true) != 0) {
prettyPrint("Installing Microsoft Visual Studio Community (Dependency)");
// thanks to @crowplexus for these two lines! - Nex
command("curl -# -O https://download.visualstudio.microsoft.com/download/pr/3105fcfe-e771-41d6-9a1c-fc971e7d03a7/8eb13958dc429a6e6f7e0d6704d43a55f18d02a253608351b6bf6723ffdaf24e/vs_Community.exe");
command("vs_Community.exe --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows10SDK.19041 -p");
FileSystem.deleteFile("vs_Community.exe");
prettyPrint('If it didn\'t say it before: Because of this component if you want to compile you have to restart the device.');
prettyPrint("Because of this component, if you want to compile, you need to restart the device.");
Sys.print("Do you wish to do it now [y/n]? ");
if(Sys.stdin().readLine().toLowerCase() == "y") command("shutdown /r /t 0 /f");
}
+6 -8
View File
@@ -5,7 +5,7 @@
title="Friday Night Funkin' - Codename Engine" main="funkin.backend.system.Main"
file="CodenameEngine" packageName="com.yoshman29.codenameengine"
package="com.yoshman29.codenameengine"
version="1.0.0" company="Yoshman29" />
version="1.0.1" company="Yoshman29" />
<!--
CHANGE THE SAVE PATH & NAME FOR YOUR MOD HERE!
@@ -50,7 +50,7 @@
<!-- _________________________________ Engine Settings _______________________________ -->
<!-- Comment this out to disable updates !-->
<!-- <define name="UPDATE_CHECKING" unless="web || hl || neko"/> -->
<define name="UPDATE_CHECKING" unless="web || hl || neko"/>
<!-- Comment this out to disable Discord RPC !-->
<section if="cpp">
@@ -166,14 +166,12 @@
<!-- OpenAL config -->
<section if="desktop">
<assets path="alsoft.txt" rename="plugins/alsoft.ini" type="text" if="windows"/>
<assets path="alsoft.txt" rename="plugins/alsoft.conf" type="text" unless="windows"/>
<assets path="building/alsoft.txt" rename="plugins/alsoft.ini" type="text" if="windows"/>
<assets path="building/alsoft.txt" rename="plugins/alsoft.conf" type="text" unless="windows"/>
</section>
<!-- ______________________________ Haxedefines _____________________________ -->
<haxeflag name="--macro" value="funkin.backend.system.macros.BuildInfo.printBuildInfo()" />
<haxedef name="FLX_NO_FOCUS_LOST_SCREEN" />
<!--Disable the Flixel core debugger. Automatically gets set whenever you compile in release mode!-->
@@ -227,9 +225,9 @@
<setenv name="HAXEPATH" value="./"/>
<haxedef name="HXCPP_M32" if="32bit" />
<haxedef name="HXCPP_CHECK_POINTER" if="release" />
<haxedef name="HXCPP_STACK_LINE" if="release" />
<haxedef name="HXCPP_DEBUG_LINK" if="debug" />
<haxedef name="HXCPP_CHECK_POINTER" />
<haxedef name="HXCPP_STACK_LINE" />
<haxedef name="HXCPP_CATCH_SEGV" />
<haxedef name="hscriptPos" /> <!-- for logging -->
+494
View File
@@ -0,0 +1,494 @@
// funkin source classes cannot be imported here
import haxe.io.Path;
import hxp.*;
import lime.tools.*;
import sys.FileSystem;
import sys.io.Process;
using StringTools;
class Project extends HXProject
{
static final TITLE:String = "Friday Night Funkin' - Codename Engine";
static final EXECUTABLE:String = "CodenameEngine";
static final VERSION:String = "1.0.1";
static final COMPANY:String = "Yoshman29";
static final PACKAGE:String = "com.codenamecrew.codenameengine";
static final MAIN_CLASS:String = "funkin.backend.system.MainApplication";
static final PRELOADER:String = "flixel.system.FlxPreloader";
static final SOURCE_FOLDERS:Array<String> = ["source"];
// Compile Flags
static final EMBED_ASSETS:CompileFlag = CompileFlag.get("EMBED_ASSETS");
static final PRELOAD_ALL:CompileFlag = CompileFlag.get("PRELOAD_ALL");
static final STRIPPED_COMPILE:CompileFlag = CompileFlag.get("STRIPPED_COMPILE");
static final UPDATE_CHECKING:CompileFlag = CompileFlag.get("UPDATE_CHECKING");
static final DISCORD_RPC:CompileFlag = CompileFlag.get("DISCORD_RPC");
static final MODCHARTING_FEATURES:CompileFlag = CompileFlag.get("MODCHARTING_FEATURES");
static final GITHUB_API:CompileFlag = CompileFlag.get("GITHUB_API");
static final COMPILE_ALL_CLASSES:CompileFlag = CompileFlag.get("COMPILE_ALL_CLASSES");
static final CUSTOM_CLASSES:CompileFlag = CompileFlag.get("CUSTOM_CLASSES");
static final ALLOW_MULTITHREADING:CompileFlag = CompileFlag.get("ALLOW_MULTITHREADING");
static final MOD_SUPPORT:CompileFlag = CompileFlag.get("MOD_SUPPORT");
static final TRANSLATIONS_SUPPORT:CompileFlag = CompileFlag.get("TRANSLATIONS_SUPPORT");
static final GLOBAL_SCRIPT:CompileFlag = CompileFlag.get("GLOBAL_SCRIPT");
static final SOFTCODED_STATES:CompileFlag = CompileFlag.get("SOFTCODED_STATES");
static final NDLLS_SUPPORTED:CompileFlag = CompileFlag.get("NDLLS_SUPPORTED");
static final USE_ADAPTED_ASSETS:CompileFlag = CompileFlag.get("USE_ADAPTED_ASSETS");
static final THREE_D_SUPPORT:CompileFlag = CompileFlag.get("THREE_D_SUPPORT");
static final NAPE_ENABLED:CompileFlag = CompileFlag.get("NAPE_ENABLED");
static final VIDEO_CUTSCENES:CompileFlag = CompileFlag.get("VIDEO_CUTSCENES");
static final SHOW_BUILD_ON_FPS:CompileFlag = CompileFlag.get("SHOW_BUILD_ON_FPS");
static final DARK_MODE_WINDOW:CompileFlag = CompileFlag.get("DARK_MODE_WINDOW");
public function new():Void
{
super();
CompileFlag.project = this;
haxe.Log.trace = (v:Dynamic, ?info:haxe.PosInfos) ->
{
if (!isDisplay())
Sys.println(v);
};
doWelcomeHeader();
trace("Configuring project...");
trace("");
configureApp();
configureCompileFlags();
configureAssets();
configureLibs();
configureIcons();
trace("");
trace("Configured project");
trace("Starting build...");
trace("");
}
function getHaxeVersion():String {
var process = new Process("haxe", ["-version"]);
var version:String = "";
try {
version = process.stdout.readAll().toString().trim();
} catch (e) {}
process.close();
return version;
}
function doWelcomeHeader() {
var haxeVersion = getHaxeVersion().trim();
var sleepChangeVersion = false;
var width = 60; // total banner width
inline function centerText(text:String, width:Int):String {
var innerWidth = width - 2;
var padding = Std.int(Math.max(0, Std.int((innerWidth - text.length) / 2)));
var left = StringTools.lpad("", " ", padding);
var right = StringTools.lpad("", " ", innerWidth - text.length - padding);
return "=" + left + text + right + "=";
}
inline function infoLine(label:String, value:String):String {
var innerWidth = width - 2;
if (label.length == 0) {
// no label: center the value
var padding = Std.int(Math.max(0, (innerWidth - value.length) / 2));
var left = StringTools.lpad("", " ", padding);
var right = StringTools.lpad("", " ", innerWidth - value.length - padding);
return "=" + left + value + right + "=";
} else {
var colonPos = Std.int(innerWidth / 2);
var labelPart = StringTools.lpad(label, " ", Std.int(Math.max(0, colonPos - 2)));
var valuePart = value;
var remainingSpace = Std.int(Math.max(0, innerWidth - (labelPart.length + 3 + valuePart.length)));
var rightPad = StringTools.lpad("", " ", remainingSpace);
return "=" + labelPart + " : " + valuePart + rightPad + "=";
}
}
var unicode = #if (target.unicode) true #else false #end;
trace('');
trace(StringTools.lpad("", "=", width));
trace(centerText(TITLE, width));
trace(StringTools.lpad("", "=", width));
trace(infoLine("Engine Version", 'v${VERSION}'));
trace(infoLine("Haxe Version", 'v${haxeVersion}'));
trace(StringTools.lpad("", "=", width));
try {
var lastBuiltWith:Null<String> = null;
var compiling = isDebug() ? "debug" : "release";
var target = isWeb() ? "html5" : (isIOS() ? "ios" : (isAndroid() ? "android" : (isWindows() ? "windows" : (isMac() ? "macos" : (isLinux() ? "linux" : "")))));
if (target == "") throw "Unknown target";
var exportPath = Sys.getCwd() + "/export/" + compiling + "/" + target + "/obj/Options.txt";
var options = sys.io.File.getContent(exportPath);
for (option in options.split("\n")) {
if (option.startsWith("haxe=")) {
lastBuiltWith = option.substr(5).trim();
break;
}
}
if (lastBuiltWith != null && lastBuiltWith.length > 0 && lastBuiltWith != haxeVersion) {
trace(infoLine("", unicode ? "⚠️ Haxe version mismatch!" : "[WARNING] Haxe version mismatch!"));
trace(infoLine("Last Built With", lastBuiltWith));
trace(infoLine("Current Version", haxeVersion));
trace(StringTools.lpad("", "=", width));
trace(infoLine("", "!!! Make sure to DELETE your EXPORT folders !!!"));
trace(StringTools.lpad("", "=", width));
sleepChangeVersion = true;
}
} catch (e) {}
var targetPlatform = isWeb() ? "Web (HTML5)" : (isIOS() ? "iOS" : (isAndroid() ? "Android" : (isWindows() ? "Windows" : (isMac() ? "Mac" : (isLinux() ? "Linux" : "Unknown")))));
if (isHashLink())
targetPlatform = "Hashlink (" + targetPlatform + ")";
trace(infoLine("Target Platform", targetPlatform));
trace(infoLine("Build Type", isDebug() ? "Debug" : "Release"));
trace(infoLine("Build Date", Date.now().toString()));
trace(StringTools.lpad("", "=", width));
trace('');
if (sleepChangeVersion)
Sys.sleep(5);
}
function configureApp():Void
{
trace("Configuring game...");
meta.title = TITLE;
meta.version = VERSION;
meta.company = COMPANY;
meta.packageName = PACKAGE;
app.main = MAIN_CLASS;
app.file = EXECUTABLE;
app.preloader = PRELOADER;
var buildDir = 'export/${isDebug() ? 'debug' : 'release'}/';
trace('Output directory: $buildDir');
app.path = buildDir;
sources = SOURCE_FOLDERS;
templatePaths.push(Path.combine(Haxelib.getPath(new Haxelib(#if lime "lime" #else "hxp" #end)), #if lime "templates" #else "" #end));
window.hardware = true;
window.vsync = false;
window.allowHighDPI = true;
if (isWeb())
window.resizable = true;
if (isDesktop())
{
window.orientation = Orientation.LANDSCAPE;
window.fullscreen = false;
window.resizable = true;
window.vsync = false;
} else if (isMobile())
{
window.orientation = Orientation.LANDSCAPE;
window.fullscreen = true;
window.resizable = false;
window.borderless = true;
window.width = 0;
window.height = 0;
}
}
function configureCompileFlags()
{
trace("Configuring compile flags...");
setDefine("disable-version-check");
setHaxedef("disable-version-check");
setHaxedef("no-deprecation-warnings");
// DO NOT REMOVE!! ALLOWS ME TO DO REGIONS LIKE IN C# AND KEEP CODE ORGANIZED. REMOVING IT WOULD BREAK THE ENGINE
setHaxedef("REGION");
setHaxedef("SAVE_PATH", EXECUTABLE);
setHaxedef("SAVE_NAME", "save-default");
setHaxedef("SAVE_OPTIONS_PATH", EXECUTABLE);
setHaxedef("SAVE_OPTIONS_NAME", "options");
PRELOAD_ALL.integrate(!isWeb());
EMBED_ASSETS.integrate(false);
UPDATE_CHECKING.integrate(!isWeb() && !isHashLink());
DISCORD_RPC.integrate(isCPP() && isDesktop());
STRIPPED_COMPILE.integrate(false); //should be isRelease() if you want to use it
MODCHARTING_FEATURES.integrate(STRIPPED_COMPILE.isDisabled());
GITHUB_API.integrate(!isWeb() && !isHashLink());
COMPILE_ALL_CLASSES.integrate(STRIPPED_COMPILE.isDisabled());
CUSTOM_CLASSES.integrate(STRIPPED_COMPILE.isDisabled());
ALLOW_MULTITHREADING.integrate(!isWeb());
MOD_SUPPORT.integrate(!isWeb());
TRANSLATIONS_SUPPORT.integrate(true);
GLOBAL_SCRIPT.integrate(true);
SOFTCODED_STATES.integrate(true);
NDLLS_SUPPORTED.integrate(!isWeb() && !isHashLink());
USE_ADAPTED_ASSETS.integrate(!isWeb());
THREE_D_SUPPORT.integrate(STRIPPED_COMPILE.isDisabled());
NAPE_ENABLED.integrate(STRIPPED_COMPILE.isDisabled());
VIDEO_CUTSCENES.integrate(isCPP() && (isDesktop() || isMobile()));
SHOW_BUILD_ON_FPS.integrate(true);
DARK_MODE_WINDOW.integrate(true);
setDefine("FLX_NO_GENERIC"); // Disable a optimization, to allow reflection to use more functions
if (DISCORD_RPC.isEnabled())
setHaxedef("DISCORD_DISABLE_IO_THREAD");
if (MODCHARTING_FEATURES.isEnabled())
{
setHaxedef("FM_ENGINE", "CODENAME");
setHaxedef("FM_ENGINE_VERSION", "1.0");
addMacroFlag("modchart.backend.macros.Macro.includeFiles()");
}
if (COMPILE_ALL_CLASSES.isEnabled())
{
addHaxeFlag("-dce no");
addMacroFlag("funkin.backend.system.macros.Macros.addAdditionalClasses()");
}
addMacroFlag("funkin.backend.system.macros.Macros.initMacros()");
if (isDebug())
setHaxedef("HXCPP_DEBUG_LINK");
environment.set("HAXEPATH", "./");
setHaxedef("HXCPP_CHECK_POINTER");
setHaxedef("HXCPP_STACK_LINE");
setHaxedef("HXCPP_CATCH_SEGV");
setHaxedef("hscriptPos");
setHaxedef("EXPERIMENTAL_FLXGRAPHIC_DESTROY_FIX");
setHaxedef("FLX_NO_FOCUS_LOST_SCREEN");
if (isRelease())
{
setHaxedef("FLX_NO_DEBUG");
setHaxedef("analyzer-optimize");
}
setHaxedef("openfl_dpi_aware");
}
function configureAssets()
{
trace("Configuring assets...");
var shouldPreload = PRELOAD_ALL.isEnabled();
var shouldEmbed = EMBED_ASSETS.isEnabled();
includeAssetLibrary("default", shouldEmbed, shouldPreload);
addAssetPath("assets", shouldEmbed);
addAsset("art/readme.txt", "do NOT readme.txt", false);
if (isDesktop())
addAsset("building/alsoft.txt", 'plugins/alsoft.${isWindows() ? "ini" : "conf"}', false);
}
function configureLibs()
{
trace("Configuring libraries...");
includeHaxelib("flixel");
includeHaxelib("flixel-addons");
includeHaxelib("format");
includeHaxelib("flxanimate");
includeHaxelib("hscript-improved");
includeHaxelib("markdown");
if (VIDEO_CUTSCENES.isEnabled())
includeHaxelib("hxvlc");
if (THREE_D_SUPPORT.isEnabled())
includeHaxelib("away3d");
if (NAPE_ENABLED.isEnabled())
includeHaxelib("nape-haxe4");
if (DISCORD_RPC.isEnabled())
includeHaxelib("hxdiscord_rpc");
if (MODCHARTING_FEATURES.isEnabled())
includeHaxelib("funkin-modchart");
if (isDebug())
includeHaxelib("hxcpp-debug-server");
}
function configureIcons()
{
trace("Configuring app icons...");
// TODO: ADD MOBILE ICONS
for (size in [16, 32, 64])
addIcon('art/icon${size}.png', size);
addIcon("art/icons/iconOG.png");
}
function includeHaxelib(name:String, version:String = ""):Void
{
haxelibs.push(new Haxelib(name, version));
}
function addAsset(path:String, ?rename:String, embed:Bool = false):Void
{
var asset = new Asset(path, rename, null, embed, true);
asset.library = "default";
assets.push(asset);
}
public function addAssetPath(path:String, ?rename:String, embed:Bool = false):Void
{
if (path == "") return;
var targetPath = Path.addTrailingSlash(rename ?? path);
if (!FileSystem.exists(path))
trace('[ERROR] Path "${path}" was not found');
else if (!FileSystem.isDirectory(path))
trace('[ERROR] Path "${path}" needs to be a directory.');
for (file in FileSystem.readDirectory(path))
{
if (FileSystem.isDirectory('${path}/${file}'))
addAssetPath('${path}/${file}', '${targetPath}${file}', embed);
else
addAsset('${path}/${file}', '${targetPath}${file}', embed);
}
}
function includeAssetLibrary(name:String, embed:Bool = false, preload:Bool = false):Void
{
this.libraries.push(new Library('', name, null, embed, preload, false, ""));
}
inline function addIcon(icon:String, ?size:Int):Void
icons.push(new Icon(icon, size));
inline function addHaxeFlag(value:String):Void
haxeflags.push(value);
inline function addMacroFlag(value:String):Void
addHaxeFlag('--macro ${value}');
inline function isDebug():Bool
return debug;
inline function isRelease():Bool
return !isDebug();
inline function isDisplay():Bool
return command == "display";
inline function isWeb():Bool
return platformType == PlatformType.WEB;
inline function isMobile():Bool
return platformType == PlatformType.MOBILE;
inline function isDesktop():Bool
return platformType == PlatformType.DESKTOP;
inline function isWindows():Bool
return target == Platform.WINDOWS;
inline function isMac():Bool
return target == Platform.MAC;
inline function isLinux():Bool
return target == Platform.LINUX;
inline function isAndroid():Bool
return target == Platform.ANDROID;
inline function isIOS():Bool
return target == Platform.IOS;
inline function isHashLink():Bool
return targetFlags.exists("hl");
inline function isCPP():Bool
return defines.exists("cpp");
public inline function getHaxedef(name:String):Null<Dynamic>
return haxedefs.get(name);
public inline function setHaxedef(name:String, ?value:String):Void
haxedefs.set(name, value ?? "");
public inline function unsetHaxedef(name:String):Void
haxedefs.remove(name);
public inline function getDefine(name:String):Null<Dynamic>
return defines.get(name);
public inline function setDefine(name:String, ?value:String):Void
defines.set(name, value ?? "");
public inline function unsetDefine(name:String):Void
defines.remove(name);
}
class CompileFlag {
public static final INVERSION:String = "NO_";
public static var project:Project;
public static function get(name:String):CompileFlag {
return new CompileFlag(name);
}
var name:String;
public function new(name:String) {
this.name = name;
}
public function enable(stopPropagation:Bool = false):Void
{
project.setHaxedef(name);
project.setDefine(name);
if (!stopPropagation)
getInverse().disable(true);
}
public function disable(stopPropagation:Bool = false):Void
{
project.unsetHaxedef(name);
project.unsetDefine(name);
if (!stopPropagation)
getInverse().enable(true);
}
public function integrate(defaultEnabled:Bool = false):Void {
var inverse = getInverse();
if (isEnabled()) inverse.disable(true); // Makes sure the inverse is disabled if it wasn't already
else if (inverse.isEnabled()) disable(true); // If the inverse is enabled, disable this
else (defaultEnabled ? enable : disable)(true); // Set to the default state otherwise
}
public function isEnabled():Bool {
return project.haxedefs.exists(name) || project.defines.exists(name);
}
public function isDisabled():Bool {
return getInverse().isEnabled() || !isEnabled();
}
function getInverse():CompileFlag {
var inversionName = name;
if (!inversionName.startsWith(INVERSION))
inversionName = INVERSION + inversionName;
return new CompileFlag(inversionName);
}
}
+42
View File
@@ -0,0 +1,42 @@
{ }:
let
pkgs = import (builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/c407032be28ca2236f45c49cfb2b8b3885294f7f.tar.gz";
}) { };
libs =
with pkgs;
[
SDL2
pkg-config
openal
alsa-lib
libvlc
libpulseaudio
libGL
]
++ (with xorg; [
libX11
libXext
libXinerama
libXi
libXrandr
]);
in
pkgs.mkShell {
name = "CodenameEngine";
packages = with pkgs; [
haxe
neko
libsForQt5.qttools
];
buildInputs = libs;
LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath libs;
shellHook = ''
source update.sh
'';
}
+6 -12
View File
@@ -126,7 +126,7 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
// hate how it looks like but hey at least its optimized and fast - Nex
if (!debugMode && isAnimFinished()) {
var name = getAnimName() + '-loop';
if (hasAnimation(name))
if (hasAnim(name))
playAnim(name, null, lastAnimContext);
}
}
@@ -307,7 +307,7 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
public function playAnim(AnimName:String, ?Force:Null<Bool>, Context:PlayAnimContext = NONE, Reversed:Bool = false, Frame:Int = 0):Void
{
if (AnimName == null)
if (AnimName == null || (!hasAnim(AnimName) && !debugMode))
return;
if (Force == null) {
@@ -318,16 +318,10 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
if (animateAtlas != null)
{
@:privateAccess
// if (!animateAtlas.anim.animsMap.exists(AnimName) && !animateAtlas.anim.symbolDictionary.exists(AnimName)) return;
animateAtlas.anim.play(AnimName, Force, Reversed, Frame);
atlasPlayingAnim = AnimName;
}
else
{
if (!animation.exists(AnimName) && !debugMode)
return;
animation.play(AnimName, Force, Reversed, Frame);
}
else animation.play(AnimName, Force, Reversed, Frame);
var daOffset = getAnimOffset(AnimName);
frameOffset.set(daOffset.x, daOffset.y);
@@ -414,9 +408,9 @@ class FunkinSprite extends FlxSkewedSprite implements IBeatReceiver implements I
}
// Backwards compat (the names used to be all different and it sucked, please lets use the same format in the future) - Nex
public inline function hasAnimation(AnimName:String) return hasAnim(AnimName);
public inline function removeAnimation(name:String) return removeAnim(name);
public inline function stopAnimation() return stopAnim();
@:dox(hide) public inline function hasAnimation(AnimName:String) return hasAnim(AnimName);
@:dox(hide) public inline function removeAnimation(name:String) return removeAnim(name);
@:dox(hide) public inline function stopAnimation() return stopAnim();
#end
// Getter / Setters
+5 -2
View File
@@ -2,11 +2,14 @@ package funkin.backend;
import flixel.text.FlxText;
import flixel.util.FlxColor;
import funkin.backend.system.Flags;
class FunkinText extends FlxText {
public function new(X:Float = 0, Y:Float = 0, FieldWidth:Float = 0, ?Text:String, Size:Int = 16, Border:Bool = true) {
public function new(X:Float = 0, Y:Float = 0, FieldWidth:Float = 0, ?Text:String, ?Size:Int, Border:Bool = true) {
if (Size == null) Size = Flags.DEFAULT_FONT_SIZE;
super(X, Y, FieldWidth, Text, Size);
setFormat(Paths.font("vcr.ttf"), Size, FlxColor.WHITE);
setFormat(Paths.font(Flags.DEFAULT_FONT), Size, FlxColor.WHITE);
if (Border) {
borderStyle = OUTLINE;
borderSize = 1;
+8 -1
View File
@@ -11,13 +11,14 @@ import funkin.backend.system.Controls;
import funkin.backend.system.GraphicCacheSprite;
import funkin.backend.system.framerate.Framerate;
import funkin.backend.system.interfaces.IBeatReceiver;
import funkin.backend.system.interfaces.IBeatCancellableReceiver;
import funkin.options.PlayerSettings;
/**
* Base class for all the states.
* Handles the scripts, the transitions, and the beat and step events.
**/
class MusicBeatState extends FlxState implements IBeatReceiver
class MusicBeatState extends FlxState implements IBeatCancellableReceiver
{
private var lastBeat:Float = 0;
private var lastStep:Float = 0;
@@ -274,6 +275,12 @@ class MusicBeatState extends FlxState implements IBeatReceiver
if (!e.cancelled)
super.openSubState(e.substate is FlxSubState ? cast e.substate : subState);
}
public override function closeSubState() {
var e = event("onCloseSubState", EventManager.get(StateEvent).recycle(subState));
if (!e.cancelled)
super.closeSubState();
}
public override function onResize(w:Int, h:Int) {
super.onResize(w, h);
+7 -1
View File
@@ -9,17 +9,23 @@ import funkin.backend.scripting.events.*;
import funkin.backend.system.Conductor;
import funkin.backend.system.Controls;
import funkin.backend.system.interfaces.IBeatReceiver;
import funkin.backend.system.interfaces.IBeatCancellableReceiver;
import funkin.options.PlayerSettings;
/**
* Base class for all the sub states.
* Handles the scripts, the transitions, and the beat and step events.
**/
class MusicBeatSubstate extends FlxSubState implements IBeatReceiver
class MusicBeatSubstate extends FlxSubState implements IBeatCancellableReceiver
{
private var lastBeat:Float = 0;
private var lastStep:Float = 0;
/**
* Whenever the Conductor auto update should be enabled or not.
*/
public var cancelConductorUpdate:Bool = false;
/**
* Whether this specific substate can open custom transitions
*/
+31 -10
View File
@@ -23,8 +23,29 @@ class Paths
});
}
public static inline function getPath(file:String, ?library:String)
return library != null ? '$library:assets/$library/$file' : 'assets/$file';
public static inline function getPath(file:String, ?library:String) {
var returnedPath:String = library != null ? '$library:assets/$library/$file' : 'assets/$file';
#if (sys && !windows)
returnedPath = Path.normalize(returnedPath);
if (OpenFlAssets.exists(returnedPath)) return returnedPath;
var fixedPath:String = library != null ? '$library:assets/$library/' : 'assets/';
var parts:Array<String> = returnedPath.split("/");
for (it=>part in parts) {
if (it == 0) continue;
var entries:Array<String> = null;
if (Path.extension(part) == "") entries = assetsTree.getFolders(fixedPath);
else entries = assetsTree.getFiles(fixedPath);
for (entry in entries) {
if (entry.toLowerCase() == part.toLowerCase()) {
fixedPath += entry + (it != parts.length - 1 ? "/" : "");
break;
}
}
}
if (returnedPath.toLowerCase() == fixedPath.toLowerCase()) returnedPath = fixedPath;
#end
return returnedPath;
}
public static inline function video(key:String, ?ext:String)
return getPath('videos/$key.${ext != null ? ext : Flags.VIDEO_EXT}');
@@ -68,18 +89,18 @@ class Paths
inline static public function music(key:String, ?library:String, ?ext:String)
return getPath('music/$key.${ext != null ? ext : Flags.SOUND_EXT}', library);
inline static public function voices(song:String, ?difficulty:String, ?prefix:String = "", ?ext:String) {
inline static public function voices(song:String, ?difficulty:String, ?suffix:String = "", ?ext:String) {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (ext == null) ext = Flags.SOUND_EXT;
var diff = getPath('songs/$song/song/Voices$prefix-${difficulty}.${ext}', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Voices$prefix.${ext}', null);
var diff = getPath('songs/$song/song/Voices$suffix-${difficulty}.${ext}', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Voices$suffix.${ext}', null);
}
inline static public function inst(song:String, ?difficulty:String, ?prefix:String = "", ?ext:String) {
inline static public function inst(song:String, ?difficulty:String, ?suffix:String = "", ?ext:String) {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (ext == null) ext = Flags.SOUND_EXT;
var diff = getPath('songs/$song/song/Inst$prefix-${difficulty}.${ext}', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Inst$prefix.${ext}', null);
var diff = getPath('songs/$song/song/Inst$suffix-${difficulty}.${ext}', null);
return OpenFlAssets.exists(diff) ? diff : getPath('songs/$song/song/Inst$suffix.${ext}', null);
}
static public function image(key:String, ?library:String, checkForAtlas:Bool = false, ?ext:String) {
@@ -107,11 +128,11 @@ class Paths
return scriptPath;
}
static public function chart(song:String, ?difficulty:String):String
static public function chart(song:String, ?difficulty:String, ?variant:String):String
{
difficulty = (difficulty != null ? difficulty : Flags.DEFAULT_DIFFICULTY);
return getPath('songs/$song/charts/$difficulty.json', null);
return getPath('songs/$song/charts/${variant != null ? variant + "/" : ""}$difficulty.json', null);
}
public static function character(character:String):String {
+141 -86
View File
@@ -71,8 +71,9 @@ class Chart {
return LEGACY;
}
public static function loadEventsJson(songName:String) {
var path = Paths.file('songs/${songName}/events.json');
public static function loadEventsJson(songName:String, ?variant:String) {
var variantSuffix = variant != null && variant != "" ? '-$variant' : "";
var path = Paths.file('songs/${songName}/events$variantSuffix.json');
var data:Array<ChartEvent> = null;
if (Assets.exists(path)) {
try {
@@ -83,62 +84,91 @@ class Chart {
return data;
}
public static function loadChartMeta(songName:String, ?difficulty:String, fromMods:Bool = true):ChartMetaData {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
inline public static function defaultChartMetaFields(data:ChartMetaData):ChartMetaData {
data.setFieldDefault("displayName", data.name);
var metaPath = Paths.file('songs/${songName}/meta.json');
var metaDiffPath = Paths.file('songs/${songName}/meta-${difficulty}.json');
data.setFieldDefault("bpm", Flags.DEFAULT_BPM);
data.setFieldDefault("beatsPerMeasure", Flags.DEFAULT_BEATS_PER_MEASURE);
data.setFieldDefault("stepsPerBeat", Flags.DEFAULT_STEPS_PER_BEAT);
data.setFieldDefault("icon", Flags.DEFAULT_HEALTH_ICON);
data.setFieldDefault("coopAllowed", Flags.DEFAULT_COOP_ALLOWED);
data.setFieldDefault("opponentModeAllowed", Flags.DEFAULT_OPPONENT_MODE_ALLOWED);
data.setFieldDefault("instSuffix", "");
data.setFieldDefault("vocalsSuffix", "");
data.setFieldDefault("needsVoices", true);
data.setFieldDefault("difficulties", []);
data.setFieldDefault("variants", []);
data.setFieldDefault("metas", []);
var data:ChartMetaData = null;
var fromMods:Bool = fromMods;
for (path in [metaDiffPath, metaPath]) if (Assets.exists(path)) {
return data;
}
public static function loadChartMeta(songName:String, ?variant:String, ?difficulty:String, fromMods:Bool = true, includeMetaVariations = true):ChartMetaData {
var folder = 'songs/$songName', isVariant = false, data:ChartMetaData = null;
var defaultPaths = [Paths.file('$folder/meta-$difficulty.json'), Paths.file('$folder/meta.json')], variantPaths = [];
if (difficulty != null) defaultPaths.unshift(Paths.file('$folder/meta-$difficulty.json'));
if (variant != null && variant != '') {
variantPaths.push(Paths.file('$folder/meta-$variant.json'));
if (difficulty != null) variantPaths.unshift(Paths.file('$folder/meta-$variant-$difficulty.json'));
}
for (path in variantPaths.concat(defaultPaths)) if (Assets.exists(path)) {
fromMods = Paths.assetsTree.existsSpecific(path, "TEXT", MODS);
try {
var tempData = Json.parse(Assets.getText(path));
tempData.color = CoolUtil.getColorFromDynamic(tempData.color).getDefault(Flags.DEFAULT_COLOR);
data = tempData;
} catch(e) Logs.trace('Failed to load song metadata for ${songName} ($path): ${Std.string(e)}', ERROR);
if (data != null) break;
} catch(e) Logs.trace('Failed to load song metadata for $songName ($path): ${Std.string(e)}', ERROR);
if (data != null) {
isVariant = variantPaths.contains(path);
break;
}
}
if (data == null) data = {
if (data != null) data.name = songName;
else data = {
name: songName,
bpm: 100
color: Flags.DEFAULT_COLOR
};
data.setFieldDefault("name", songName);
data.setFieldDefault("bpm", Flags.DEFAULT_BPM);
data.setFieldDefault("beatsPerMeasure", Flags.DEFAULT_BEATS_PER_MEASURE);
data.setFieldDefault("stepsPerBeat", Flags.DEFAULT_STEPS_PER_BEAT);
data.setFieldDefault("needsVoices", true);
data.setFieldDefault("icon", Flags.DEFAULT_HEALTH_ICON);
data.setFieldDefault("difficulties", []);
data.setFieldDefault("coopAllowed", Flags.DEFAULT_COOP_ALLOWED);
data.setFieldDefault("opponentModeAllowed", Flags.DEFAULT_OPPONENT_MODE_ALLOWED);
data.setFieldDefault("displayName", data.name);
if (isVariant) data.variant = variant;
else data.variant = null;
defaultChartMetaFields(data);
if (data.difficulties.length <= 0) {
data.difficulties = [for(f in Paths.getFolderContent('songs/${songName}/charts/', false, fromMods ? MODS : SOURCE)) if (Path.extension(f.toUpperCase()) == "JSON") Path.withoutExtension(f)];
var tempDiffs = [];
var path = 'songs/$songName/charts/';
if (isVariant) path += '$variant/';
data.difficulties = [for(f in Paths.getFolderContent(path, false, fromMods ? MODS : SOURCE)) if (Path.extension(f.toUpperCase()) == "JSON") Path.withoutExtension(f)];
if (data.difficulties.length == 3) {
for(d in data.difficulties) {
switch(d.toLowerCase()) {
case "easy": tempDiffs.insert(0, d);
case "normal": tempDiffs.insert(1, d);
case "hard": tempDiffs.insert(2, d);
}
var tempDiffs = [];
for (d in data.difficulties) switch(d.toLowerCase()) {
case "easy": tempDiffs.insert(0, d);
case "normal": tempDiffs.insert(1, d);
case "hard": tempDiffs.insert(2, d);
}
data.difficulties = tempDiffs;
if (tempDiffs.length == 3) data.difficulties = tempDiffs;
}
}
data.metas = [];
if (includeMetaVariations && data.variants.length > 0) for (variant in data.variants) {
if (!data.metas.exists(variant) && Assets.exists(Paths.file('songs/$songName/meta-$variant.json'))) {
var meta = loadChartMeta(songName, variant, fromMods);
if (meta.variant != null) data.metas.set(variant, meta);
}
}
return data;
}
public static function parse(songName:String, ?difficulty:String):ChartData {
public static function parse(songName:String, ?difficulty:String, ?variant:String):ChartData {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
var chartPath = Paths.chart(songName, difficulty);
var chartPath = Paths.chart(songName, difficulty, variant);
var base:ChartData = {
strumLines: [],
noteTypes: [],
@@ -152,15 +182,15 @@ class Chart {
fromMods: Paths.assetsTree.existsSpecific(chartPath, "TEXT", MODS)
};
var valid:Bool = true;
var valid:Bool = true, namePrint = '$songName $difficulty' + ((variant != null && variant != '') ? ' ($variant)' : '');
if (!Assets.exists(chartPath)) {
Logs.error('Chart for song ${songName} ($difficulty) at "$chartPath" was not found.');
Logs.error('Chart for song $namePrint at "$chartPath" was not found.');
valid = false;
}
var data:Dynamic = null;
if (valid) {
try data = Json.parse(Assets.getText(chartPath))
catch(e) Logs.trace('Could not parse chart for song ${songName} ($difficulty): ${Std.string(e)}', ERROR, RED);
catch(e) Logs.trace('Could not parse chart for song $namePrint: ${Std.string(e)}', ERROR, RED);
}
/**
@@ -192,13 +222,12 @@ class Chart {
}
#end
var loadedMeta = loadChartMeta(songName, difficulty, base.fromMods);
var loadedMeta = loadChartMeta(songName, variant, difficulty, base.fromMods, false);
if (base.meta == null) base.meta = loadedMeta;
else {
for (field in Reflect.fields(base.meta)) {
var f = Reflect.field(base.meta, field);
if (f != null)
Reflect.setField(loadedMeta, field, f);
if (f != null) Reflect.setField(loadedMeta, field, f);
}
base.meta = loadedMeta;
}
@@ -207,9 +236,8 @@ class Chart {
* events.json LOADING
*/
#if REGION
var extraEvents:Array<ChartEvent> = loadEventsJson(songName);
if (extraEvents != null)
base.events = base.events.concat(extraEvents);
var extraEvents:Array<ChartEvent> = loadEventsJson(songName, variant);
if (extraEvents != null) base.events = base.events.concat(extraEvents);
#end
/**
@@ -237,61 +265,59 @@ class Chart {
/**
* Saves the chart to the specific song folder path.
* @param songFolderPath Path to the song folder (ex: `mods/your mod/songs/song/`)
* @param chart Chart to save
* @param difficulty Name of the difficulty
* @param saveSettings
* @param chart Chart to save.
* @param difficulty Name of the difficulty (Optional).
* @param variant Name of the Variant (Optional).
* @param saveSettings (Optional).
* @return Filtered chart used for saving.
*/
public static function save(songFolderPath:String, chart:ChartData, ?difficulty:String, ?saveSettings:ChartSaveSettings):ChartData {
public static function save(chart:ChartData, ?difficulty:String, ?variant:String, ?saveSettings:ChartSaveSettings):ChartData {
if (difficulty == null) difficulty = Flags.DEFAULT_DIFFICULTY;
if (saveSettings == null) saveSettings = {};
if (saveSettings.saveMetaInChart == null) saveSettings.saveMetaInChart = true;
if (saveSettings.saveLocalEvents == null) saveSettings.saveLocalEvents = true;
if (saveSettings.saveGlobalEvents == null) saveSettings.saveGlobalEvents = false;
var filteredChart = filterChartForSaving(chart, saveSettings.saveMetaInChart, saveSettings.saveLocalEvents, saveSettings.saveGlobalEvents);
var meta = filteredChart.meta;
var filteredChart = filterChartForSaving(chart, saveSettings.saveMetaInChart, saveSettings.saveLocalEvents, saveSettings.saveGlobalEvents && saveSettings.seperateGlobalEvents != true);
#if sys
var saveFolder:String = saveSettings.folder == null ? "charts" : saveSettings.folder;
var songPath = saveSettings.songFolder == null ? 'songs/${chart.meta.name}' : saveSettings.songFolder, variantSuffix = variant != null && variant != "" ? '-$variant' : "";
var metaPath = 'meta$variantSuffix.json', prettyPrint = saveSettings.prettyPrint == true ? Flags.JSON_PRETTY_PRINT : null, temp:String;
if ((temp = Paths.assetsTree.getPath('assets/$songPath/$metaPath')) != null) {
songPath = temp.substr(0, temp.length - metaPath.length - 1);
metaPath = temp;
}
else if (saveSettings.songFolder == null)
metaPath = (songPath = '${Paths.getAssetsRoot()}/$songPath') + '/$metaPath';
if (!FileSystem.exists('${songFolderPath}/$saveFolder/'))
FileSystem.createDirectory('${songFolderPath}/$saveFolder/');
var chartFolder = saveSettings.folder == null ? ((variant == null || variant == '') ? 'charts' : 'charts/$variant') : saveSettings.folder;
var chartPath = '$songPath/$chartFolder/${difficulty.trim()}.json';
var chartPath = '${songFolderPath}/$saveFolder/${difficulty.trim()}.json';
var metaPath = '${songFolderPath}/meta.json';
if (saveSettings.saveChart == null || saveSettings.saveChart == true)
CoolUtil.safeSaveFile(chartPath, Json.stringify(filteredChart, null, prettyPrint));
CoolUtil.safeSaveFile(chartPath, Json.stringify(filteredChart, null, saveSettings.prettyPrint == true ? Flags.JSON_PRETTY_PRINT : null));
if (saveSettings.overrideExistingMeta || !FileSystem.exists(metaPath))
CoolUtil.safeSaveFile(metaPath, Json.stringify(filterMetaForSaving(chart.meta), null, prettyPrint));
if (saveSettings.overrideExistingMeta == true || !FileSystem.exists(metaPath))
CoolUtil.safeSaveFile(metaPath, makeMetaSaveable(meta));
if (saveSettings.seperateGlobalEvents == true) {
var eventsPath = '$songPath/events$variantSuffix.json', events = filterEventsForSaving(chart.events, false, true);
if (events.length != 0) CoolUtil.safeSaveFile(eventsPath, Json.stringify({events: events}, null, prettyPrint));
}
#end
return filteredChart;
}
public static function filterChartForSaving(chart:ChartData, ?saveMetaInChart:Bool, ?saveLocalEvents:Bool, ?saveGlobalEvents:Bool):ChartData {
public static function filterChartForSaving(chart:ChartData, saveMetaInChart = true, ?saveLocalEvents:Bool, ?saveGlobalEvents:Bool):ChartData {
var meta = chart.meta, events = chart.events;
chart.meta = null;
chart.events = null;
var data = Reflect.copy(chart); // make a copy of the chart to leave the OG intact
if (saveMetaInChart != true) {
data.meta = null;
} else {
data.meta = Reflect.copy(chart.meta); // also make a copy of the metadata to leave the OG intact.
if (data.meta != null && Reflect.hasField(data.meta, "parsedColor")) Reflect.deleteField(data.meta, "parsedColor");
}
// in this part abt the events, i gotta account that these booleans can be null - Nex
if (saveLocalEvents != true && saveGlobalEvents != true) data.events = null;
else {
data.events = [];
for (event in chart.events) if ((saveLocalEvents == true && event.global != true) || (saveGlobalEvents == true && event.global == true)) {
var copy = Reflect.copy(event);
if (saveLocalEvents == true ? event.global != true : event.global == true) Reflect.deleteField(copy, "global"); // should NOT delete the field when saving with the local events and the event should have been global - Nex
data.events.push(copy);
}
if (data.events.length == 0) data.events = null;
}
chart.meta = meta;
chart.events = events;
data.meta = saveMetaInChart ? filterMetaForSaving(meta) : null;
data.events = filterEventsForSaving(events, saveLocalEvents, saveGlobalEvents);
data.fromMods = null;
var sortedData:Dynamic = {};
@@ -303,18 +329,47 @@ class Chart {
return sortedData;
}
public static inline function makeMetaSaveable(meta:ChartMetaData, prettyPrint:Bool = true):String {
public static function filterEventsForSaving(events:Array<ChartEvent>, saveLocalEvents = true, saveGlobalEvents = false):Array<ChartEvent> {
var data = [];
if (!saveLocalEvents && !saveGlobalEvents) return data;
for (event in events) if ((saveLocalEvents && event.global != true) || (saveGlobalEvents && event.global == true)) {
var copy = Reflect.copy(event);
if (saveLocalEvents ? event.global != true : event.global == true) Reflect.deleteField(copy, "global"); // should NOT delete the field when saving with the local events and the event should have been global - Nex
data.push(copy);
}
return data;
}
public static inline function makeMetaSaveable(meta:ChartMetaData, prettyPrint:Bool = true):String
return Json.stringify(filterMetaForSaving(meta), null, prettyPrint ? Flags.JSON_PRETTY_PRINT : null);
public static inline function filterMetaForSaving(meta:ChartMetaData):ChartMetaData {
var data:Dynamic = Reflect.copy(meta);
if (data.color != null) data.color = new FlxColor(data.color).toWebString(); // dont even ask me - Nex
return Json.stringify(data, null, prettyPrint ? Flags.JSON_PRETTY_PRINT : null);
if (data.color != null) data.color = FlxColor.fromInt(data.color).toWebString(); // dont even ask me - Nex
Reflect.deleteField(data, "name");
Reflect.deleteField(data, 'parsedColor');
Reflect.deleteField(data, 'metas');
Reflect.deleteField(data, "variant");
if (data.instSuffix != null && data.instSuffix == "") Reflect.deleteField(data, "instSuffix");
if (data.vocalsSuffix != null && data.vocalsSuffix == "") Reflect.deleteField(data, "vocalsSuffix");
if (data.variants != null && data.variants.length == 0) Reflect.deleteField(data, "variants");
return data;
}
}
typedef ChartSaveSettings = {
var ?overrideExistingMeta:Bool;
var ?prettyPrint:Bool;
var ?saveMetaInChart:Bool;
var ?saveLocalEvents:Bool;
var ?saveGlobalEvents:Bool;
var ?prettyPrint:Bool;
var ?saveChart:Bool;
var ?overrideExistingMeta:Bool;
var ?seperateGlobalEvents:Bool;
var ?folder:String;
}
var ?songFolder:String;
}
+13 -3
View File
@@ -18,16 +18,26 @@ typedef ChartData = {
typedef ChartMetaData = {
public var name:String;
public var ?bpm:Float;
public var ?variant:String;
public var ?displayName:String;
public var ?bpm:Float;
public var ?beatsPerMeasure:Float;
public var ?stepsPerBeat:Int;
public var ?difficulties:Array<String>;
public var ?variants:Array<String>;
public var ?customValues:Dynamic;
public var ?icon:String;
public var ?color:FlxColor;
public var ?difficulties:Array<String>;
public var ?coopAllowed:Bool;
public var ?opponentModeAllowed:Bool;
public var ?customValues:Dynamic;
public var ?metas:Map<String, ChartMetaData>;
public var ?instSuffix:String;
public var ?vocalsSuffix:String;
public var ?needsVoices:Bool;
}
+8 -3
View File
@@ -10,7 +10,7 @@ import openfl.Assets;
using StringTools;
class EventsData {
public static var defaultEventsList:Array<String> = ["HScript Call", "Camera Movement", "Camera Position", "Add Camera Zoom", "Camera Zoom", "Camera Modulo Change", "Camera Flash", "BPM Change", "Continuous BPM Change", "Time Signature Change", "Scroll Speed Change", "Alt Animation Toggle", "Play Animation"];
public static var defaultEventsList:Array<String> = ["HScript Call", "Camera Movement", "Camera Position", "Add Camera Zoom", "Camera Bop", "Camera Zoom", "Camera Modulo Change", "Camera Flash", "BPM Change", "Continuous BPM Change", "Time Signature Change", "Scroll Speed Change", "Alt Animation Toggle", "Play Animation"];
public static var defaultEventsParams:Map<String, Array<EventParamInfo>> = [
"HScript Call" => [
{name: "Function Name", type: TString, defValue: "myFunc"},
@@ -56,6 +56,9 @@ class EventsData {
{name: "Amount", type: TFloat(-10, 10, 0.01, 2), defValue: 0.05},
{name: "Camera", type: TDropDown(['camGame', 'camHUD']), defValue: "camGame"}
],
"Camera Bop" => [
{name: "Amount", type: TFloat(-10, 10, 0.1, 2), defValue: 0.1}
],
"Camera Zoom" => [
{name: "Tween Zoom?", type: TBool, defValue: true},
{name: "New Zoom", type: TFloat(-10, 10, 0.01, 2), defValue: 1},
@@ -161,8 +164,10 @@ class EventsData {
if (fileTxt.trim() == "") continue;
eventsList.push(eventName);
eventsParams.set(eventName, []);
if (!eventsList.contains(eventName)) {
eventsList.push(eventName);
eventsParams.set(eventName, []);
}
try {
var data:EventInfoFile = cast Json.parse(fileTxt);
+8 -12
View File
@@ -26,12 +26,12 @@ class VSliceParser {
stage: Flags.DEFAULT_STAGE,
codenameChart: true
};
parseChart(Reflect.field(chartData.notes, diff), metaData, chartData.events, base);
parseChart(Reflect.field(chartData.notes, diff), metaData, chartData.events, base, resultMeta);
resultCharts.push({diffName: diff, chart: base});
}
}
public static function parseChart(data:Dynamic, metaData:Dynamic, events:Dynamic, result:ChartData) {
public static function parseChart(data:Dynamic, metaData:Dynamic, events:Dynamic, result:ChartData, resultMeta:ChartMetaData) {
// vslice chart parsing
var data:Array<SwagNote> = data;
var metadata:SwagMetadata = metaData;
@@ -45,14 +45,14 @@ class VSliceParser {
type: 0,
position: (p2isGF = metadata.playData.characters.opponent.startsWith("gf")) ? "girlfriend" : "dad",
notes: [],
vocalsSuffix: "-Opponent"
vocalsSuffix: '-${metadata.playData.characters.opponent}${resultMeta.vocalsSuffix != null ? resultMeta.vocalsSuffix : ""}'
});
result.strumLines.push({
characters: [metadata.playData.characters.player],
type: 1,
position: "boyfriend",
notes: [],
vocalsSuffix: "-Player"
vocalsSuffix: '-${metadata.playData.characters.player}${resultMeta.vocalsSuffix != null ? resultMeta.vocalsSuffix : ""}'
});
var gfName = metadata.playData.characters.girlfriend;
if (!p2isGF && gfName != "none") {
@@ -67,7 +67,7 @@ class VSliceParser {
var timeChanges = metadata.timeChanges;
result.meta.bpm = timeChanges[0].bpm;
result.meta.needsVoices = true;
result.meta.needsVoices = false;
for (note in data)
{
@@ -108,7 +108,7 @@ class VSliceParser {
{
case "FocusCamera":
var isPosOnly = false;
var arr:Array<Dynamic> = [switch(values.char) {
var arr:Array<Dynamic> = [switch(values is Int ? values : values.char) {
// more cases here in the future if they add em? (i hope not) - Nex
case 0: 1;
case 1: 0;
@@ -177,16 +177,12 @@ class VSliceParser {
var songID:String = songID == null ? songName.toLowerCase().replace(" ", "-") : songID;
var firstTimeChange:SwagTimeChange = data.timeChanges[0];
result.name = songID;
result.bpm = firstTimeChange.bpm.getDefault(Flags.DEFAULT_BPM);
result.beatsPerMeasure = firstTimeChange.n.getDefault(Flags.DEFAULT_BEATS_PER_MEASURE);
result.stepsPerBeat = firstTimeChange.d.getDefault(Flags.DEFAULT_STEPS_PER_BEAT);
result.displayName = songName;
result.icon = Flags.DEFAULT_HEALTH_ICON;
result.color = 0xFFFFFF;
result.opponentModeAllowed = true;
result.coopAllowed = true;
result.difficulties = data.playData.difficulties.concat(data.playData.songVariations.getDefault([]));
result.difficulties = data.playData.difficulties.copy();
if (data.playData.songVariations != null) result.variants = data.playData.songVariations.copy();
if (result.customValues == null) result.customValues = {};
result.customValues.artist = data.artist;
+16 -16
View File
@@ -106,20 +106,8 @@ class GlobalScript {
});
}
public static function event<T:CancellableEvent>(name:String, event:T):T {
if (scripts != null)
scripts.event(name, event);
return event;
}
public static function call(name:String, ?args:Array<Dynamic>) {
if (scripts != null)
scripts.call(name, args);
}
public static function onModSwitch(newMod:String) {
call("destroy");
scripts = FlxDestroyUtil.destroy(scripts);
destroy();
scripts = new ScriptPack("GlobalScript");
for (i in funkin.backend.assets.ModsFolder.getLoadedMods()) {
var path = Paths.script('data/global/LIB_$i');
@@ -132,12 +120,24 @@ class GlobalScript {
}
}
public static function beatHit(curBeat:Int) {
call("beatHit", [curBeat]);
public static inline function event<T:CancellableEvent>(name:String, event:T):T {
if (scripts != null)
scripts.event(name, event);
return event;
}
public static function stepHit(curStep:Int) {
public static inline function call(name:String, ?args:Array<Dynamic>)
if (scripts != null) scripts.call(name, args);
public static inline function beatHit(curBeat:Int)
call("beatHit", [curBeat]);
public static inline function stepHit(curStep:Int)
call("stepHit", [curStep]);
public static inline function destroy() if (scripts != null) {
call("destroy");
scripts = FlxDestroyUtil.destroy(scripts);
}
}
#end
+20 -1
View File
@@ -34,6 +34,7 @@ class HScript extends Script {
__importedPaths = [path];
interp.errorHandler = _errorHandler;
interp.warnHandler = _warnHandler;
interp.importFailedCallback = importFailedCallback;
interp.staticVariables = Script.staticVariables;
interp.allowStaticVariables = interp.allowPublicVariables = true;
@@ -63,7 +64,7 @@ class HScript extends Script {
return this;
}
private function importFailedCallback(cl:Array<String>):Bool {
private function importFailedCallback(cl:Array<String>, ?asName:String):Bool {
if(_importFailedCallback(cl, "source/") || _importFailedCallback(cl, "")) {
return true;
}
@@ -117,6 +118,24 @@ class HScript extends Script {
], ERROR);
}
private function _warnHandler(error:Error) {
var fileName = error.origin;
var oldfn = '$fileName:${error.line}: ';
if(remappedNames.exists(fileName))
fileName = remappedNames.get(fileName);
var fn = '$fileName:${error.line}: ';
var err = error.toString();
while(err.startsWith(oldfn) || err.startsWith(fn)) {
if (err.startsWith(oldfn)) err = err.substr(oldfn.length);
if (err.startsWith(fn)) err = err.substr(fn.length);
}
Logs.traceColored([
Logs.logText(fn, GREEN),
Logs.logText(err, YELLOW)
], WARNING);
}
public override function setParent(parent:Dynamic) {
interp.scriptObject = parent;
}
+7 -1
View File
@@ -28,6 +28,11 @@ class Script extends FlxBasic implements IFlxDestroyable {
"Reflect" => Reflect,
"StringTools" => StringTools,
"Json" => haxe.Json,
"Xml" => Xml,
"Type" => Type,
"Date" => Date,
"Lambda" => Lambda,
#if sys "Sys" => Sys, #end
// OpenFL & Lime related stuff
"Assets" => openfl.utils.Assets,
@@ -89,6 +94,7 @@ class Script extends FlxBasic implements IFlxDestroyable {
"FlxAnimate" => funkin.backend.FlxAnimate,
"FunkinSprite" => funkin.backend.FunkinSprite,
"Alphabet" => funkin.menus.ui.Alphabet,
"Flags" => funkin.backend.system.Flags,
"CoolUtil" => funkin.backend.utils.CoolUtil,
"IniUtil" => funkin.backend.utils.IniUtil,
@@ -395,4 +401,4 @@ class Script extends FlxBasic implements IFlxDestroyable {
* Called when the script is loaded.
*/
public function onLoad() {}
}
}
@@ -9,6 +9,10 @@ final class FreeplaySongSelectEvent extends CancellableEvent {
* Difficulty name
*/
public var difficulty:String;
/**
* Variation Name
*/
public var variant:String;
/**
* Whenever opponent mode is enabled or not.
*/
+9 -2
View File
@@ -4,6 +4,7 @@ import flixel.FlxState;
import flixel.util.FlxSignal.FlxTypedSignal;
import funkin.backend.chart.ChartData;
import funkin.backend.system.interfaces.IBeatReceiver;
import funkin.backend.system.interfaces.IBeatCancellableReceiver;
import funkin.editors.charter.Charter;
enum BeatType {
@@ -371,8 +372,14 @@ final class Conductor
private static var __updateMeasure:Bool;
private static function update() {
if (FlxG.state != null && FlxG.state is MusicBeatState && cast(FlxG.state, MusicBeatState).cancelConductorUpdate) return;
if (FlxG.state == null) return;
else {
var state = FlxG.state;
while (state != null) {
if (state is IBeatCancellableReceiver && cast(FlxG.state, IBeatCancellableReceiver).cancelConductorUpdate) return;
state = state.subState;
}
}
__updateSongPos(FlxG.elapsed);
var oldStep = curStep, oldBeat = curBeat, oldMeasure = curMeasure, oldChangeIndex = curChangeIndex;
+6
View File
@@ -22,6 +22,7 @@ enum Control
ACCEPT;
BACK;
PAUSE;
CHANGE_MODE;
//CHEAT;
SWITCHMOD;
@@ -145,6 +146,11 @@ class Controls extends FlxActionSet
@:pressed("reset") public var RESET_HOLD(get, set): Bool;
@:justReleased("reset") public var RESET_R(get, set): Bool;
@:gamepad([FlxGamepadInputID.BACK]) // select button
@:justPressed("change-mode") public var CHANGE_MODE(get, set): Bool;
@:pressed("change-mode") public var CHANGE_MODE_HOLD(get, set): Bool;
@:justReleased("change-mode") public var CHANGE_MODE_R(get, set): Bool;
//@:gamepad([])
//@:justPressed("cheat") public var CHEAT(get, set): Bool;
//@:pressed("cheat") public var CHEAT_HOLD(get, set): Bool;
+28 -7
View File
@@ -26,8 +26,8 @@ class Flags {
public static var MOD_DOWNLOAD_LINK:String = "";
public static var MOD_DEPENDENCIES:Array<String> = [];
@:noCompletion public static var MOD_ICON64:String = "";
@:noCompletion public static var MOD_ICON32:String = "";
@:noCompletion public static var MOD_ICON24:String = "";
@:noCompletion public static var MOD_ICON16:String = "";
public static var MOD_ICON:String = "";
@@ -46,6 +46,7 @@ class Flags {
public static var COMMIT_HASH:String = GitCommitMacro.commitHash;
public static var COMMIT_MESSAGE:String = 'Commit $COMMIT_NUMBER ($COMMIT_HASH)';
@:bypass public static var WINDOW_TITLE_USE_MOD_NAME:Bool = false;
@:lazy public static var TITLE:String = Application.current.meta.get('name');
@:lazy public static var VERSION:String = Application.current.meta.get('version');
@@ -126,6 +127,9 @@ class Flags {
public static var DEFAULT_NOTE_MS_LIMIT:Float = 1500;
public static var DEFAULT_NOTE_SCALE:Float = 0.7;
#if MODCHARTING_FEATURES
public static var DEFAULT_MODCHART_HOLD_SUBDIVISIONS:Int = 4;
#end
@:also(funkin.game.Character.FALLBACK_DEAD_CHARACTER)
public static var DEFAULT_GAMEOVER_CHARACTER:String = "bf-dead";
@@ -136,7 +140,18 @@ class Flags {
public static var DEFAULT_CAM_ZOOM_STRENGTH:Int = 1;
public static var DEFAULT_CAM_ZOOM:Float = 1.05; // what zoom level it defaults to
public static var DEFAULT_HUD_ZOOM:Float = 1.0;
public static var MAX_CAMERA_ZOOM_MULT:Float = 1.35;
public static var DEFAULT_ZOOM:Float = 1.0;
public static var DEFAULT_ZOOM_LERP:Float = 0.05;
public static var MAX_CAMERA_ZOOM_MULT:Float = 10;
public static var USE_CAM_ZOOM_MULT:Bool = true;
public static var DEFAULT_CAM_ZOOM_MULT:Float = 0.015;
public static var DEFAULT_HUD_ZOOM_MULT:Float = 0.03;
public static var DEFAULT_CAM_ZOOM_LERP:Float = 0.05;
public static var DEFAULT_HUD_ZOOM_LERP:Float = 0.05;
// Font configuration
public static var DEFAULT_FONT:String = "vcr.ttf";
public static var DEFAULT_FONT_SIZE:Int = 16;
// to translate these you need to convert them into ids
// Resume -> pause.resume
@@ -158,17 +173,13 @@ class Flags {
public static var DEFAULT_HEALTH:Null<Float> = null;//DEFAULT_MAX_HEALTH / 2.0;
public static var DEFAULT_ICONBOP:Bool = true;
public static var BOP_ICON_SCALE:Float = 1.2;
public static var ICON_DEFAULT_SCALE:Float = 1;
public static var ICON_OFFSET:Float = 26;
public static var ICON_LERP:Float = 0.33;
public static var DEFAULT_INTRO_LENGTH:Int = 5;
public static var DEFAULT_INTRO_SPRITES:Array<String> = [null, 'game/ready', 'game/set', 'game/go'];
public static var CAM_BOP_STRENGTH:Float = 0.015;
public static var HUD_BOP_STRENGTH:Float = 0.03;
public static var DEFAULT_CAM_ZOOM_LERP:Float = 0.05;
public static var DEFAULT_HUD_ZOOM_LERP:Float = 0.05;
public static var MAX_SPLASHES:Int = 8;
public static var STUNNED_TIME:Float = 5 / 60;
@@ -193,6 +204,7 @@ class Flags {
public static var DISABLE_WARNING_SCREEN:Bool = true;
public static var DISABLE_TRANSITIONS:Bool = false;
public static var DISABLE_LANGUAGES:Bool = false;
public static var DISABLE_AUTOUPDATER:Bool = false;
@:also(funkin.backend.MusicBeatTransition.script)
public static var DEFAULT_TRANSITION_SCRIPT:String = "";
@@ -265,6 +277,8 @@ class Flags {
@:bypass public static var customFlags:Map<String, String> = [];
public static function loadFromData(flags:Map<String, String>, data:String) {
WINDOW_TITLE_USE_MOD_NAME = false;
if (!(data.length > 0)) return;
var res = IniUtil.parseString(data);
@@ -281,6 +295,11 @@ class Flags {
else trace('Invalid section $name');
}
}
if (!flags.exists("WINDOW_TITLE_USE_MOD_NAME")) WINDOW_TITLE_USE_MOD_NAME = !flags.exists('TITLE') && flags.exists('MOD_NAME');
else WINDOW_TITLE_USE_MOD_NAME = parseBool(flags.get("WINDOW_TITLE_USE_MOD_NAME"));
flags.remove("WINDOW_TITLE_USE_MOD_NAME");
}
public static function loadFromDatas(datas:Array<String>) {
@@ -296,6 +315,8 @@ class Flags {
for(name=>value in flags)
if(!parse(name, value))
customFlags.set(name, value);
Options.modchartingHoldSubdivisions = DEFAULT_MODCHART_HOLD_SUBDIVISIONS;
}
/**
@@ -0,0 +1,14 @@
package funkin.backend.system;
import lime.app.Application;
import funkin.backend.system.Main;
class MainApplication extends Application {
public function new() {
super();
#if openfl
openfl.Lib.current.stage.addChild(new Main());
#end
}
}
+17 -8
View File
@@ -66,12 +66,12 @@ class MainState extends FlxState {
)
];
for(path in addonPaths) {
for (path in addonPaths) {
if (path == null) continue;
if (!isDirectory(path)) continue;
for(addon in FileSystem.readDirectory(path)) {
if(!FileSystem.isDirectory(path + addon)) {
for (addon in FileSystem.readDirectory(path)) {
if (!FileSystem.isDirectory(path + addon)) {
switch(Path.extension(addon).toLowerCase()) {
case 'zip':
addon = Path.withoutExtension(addon);
@@ -90,7 +90,14 @@ class MainState extends FlxState {
else _noPriorityAddons.insert(0, data);
}
}
#end
#if GLOBAL_SCRIPT
funkin.backend.scripting.GlobalScript.destroy();
#end
funkin.backend.scripting.Script.staticVariables.clear();
#if MOD_SUPPORT
for (addon in _lowPriorityAddons)
loadLib(addon.path, ltrim(addon.name, "[LOW]"));
@@ -112,7 +119,8 @@ class MainState extends FlxState {
TranslationUtil.setLanguage(Flags.DISABLE_LANGUAGES ? Flags.DEFAULT_LANGUAGE : null);
ModsFolder.onModSwitch.dispatch(ModsFolder.currentModFolder); // Loads global.hx
MusicBeatTransition.script = Flags.DEFAULT_TRANSITION_SCRIPT;
WindowUtils.resetTitle();
WindowUtils.resetAffixes(false);
WindowUtils.setWindow();
Main.refreshAssets();
DiscordUtil.init();
EventsData.reloadEvents();
@@ -126,6 +134,8 @@ class MainState extends FlxState {
CoolUtil.safeAddAttributes('./.temp/', NativeAPI.FileAttribute.HIDDEN);
#end
var startState:Class<FlxState> = Flags.DISABLE_WARNING_SCREEN ? TitleState : funkin.menus.WarningState;
if (Options.devMode && Options.allowConfigWarning) {
var lib:ModsFolderLibrary;
for (e in Paths.assetsTree.libraries) if ((lib = cast AssetsLibraryList.getCleanLibrary(e)) is ModsFolderLibrary
@@ -133,12 +143,11 @@ class MainState extends FlxState {
{
if (lib.exists(Paths.ini("config/modpack"), lime.utils.AssetType.TEXT)) break;
FlxG.switchState(new ModConfigWarning(lib));
FlxG.switchState(new ModConfigWarning(lib, startState));
return;
}
}
if (!Flags.DISABLE_WARNING_SCREEN) FlxG.switchState(new funkin.menus.WarningState());
else FlxG.switchState(new TitleState());
FlxG.switchState(cast Type.createInstance(startState, []));
}
}
}
+23 -29
View File
@@ -12,13 +12,13 @@ import haxe.Exception;
* Requires the `GITHUB_API` macro to be defined.
* This has no authentication, so it's limited to unauthenticated requests, and rate limits.
**/
class GitHub {
final class GitHub {
/**
* Gets all the releases from a specific GitHub repository using the GitHub API.
* @param user The user/organization that owns the repository
* @param repository The repository name
* @param onError Error Callback
* @return Releases
* @param user The user/organization that owns the repository.
* @param repository The repository name.
* @param onError Error Callback.
* @return Releases in Array.
*/
public static function getReleases(user:String, repository:String, ?onError:Exception->Void):Array<GitHubRelease> {
#if GITHUB_API
@@ -38,17 +38,16 @@ class GitHub {
/**
* Gets the contributors list from a specific GitHub repository using the GitHub API.
* @param user The user/organization that owns the repository
* @param repository The repository name
* @param onError Error Callback
* @return Contributors List
* @param user The user/organization that owns the repository.
* @param repository The repository name.
* @param onError Error Callback.
* @return Contributors List as Array.
*/
public static function getContributors(user:String, repository:String, ?onError:Exception->Void):Array<GitHubContributor> {
#if GITHUB_API
try {
var data = Json.parse(HttpUtil.requestText('https://api.github.com/repos/${user}/${repository}/contributors'));
if (!(data is Array))
throw __parseGitHubException(data);
if (!(data is Array)) throw __parseGitHubException(data);
return data;
} catch(e) {
@@ -61,16 +60,15 @@ class GitHub {
/**
* Gets a specific GitHub organization using the GitHub API.
* @param org The organization to get
* @param onError Error Callback
* @return Organization
* @param org The organization to get.
* @param onError Error Callback.
* @return Organization.
*/
public static function getOrganization(org:String, ?onError:Exception->Void):GitHubOrganization {
#if GITHUB_API
try {
var data = Json.parse(HttpUtil.requestText('https://api.github.com/orgs/$org'));
if (Reflect.hasField(data, "documentation_url"))
throw __parseGitHubException(data);
if (Reflect.hasField(data, "documentation_url")) throw __parseGitHubException(data);
return data;
} catch(e) {
@@ -84,16 +82,15 @@ class GitHub {
/**
* Gets the members list from a specific GitHub organization using the GitHub API.
* NOTE: Members use Contributors' structure!
* @param org The organization to get the members from
* @param onError Error Callback
* @return Members List
* @param org The organization to get the members from.
* @param onError Error Callback.
* @return Members List as Array
*/
public static function getOrganizationMembers(org:String, ?onError:Exception->Void):Array<GitHubContributor> {
#if GITHUB_API
try {
var data = Json.parse(HttpUtil.requestText('https://api.github.com/orgs/$org/members'));
if (Reflect.hasField(data, "documentation_url"))
throw __parseGitHubException(data);
if (Reflect.hasField(data, "documentation_url")) throw __parseGitHubException(data);
return data;
} catch(e) {
@@ -107,18 +104,15 @@ class GitHub {
/**
* Gets a specific GitHub user/organization using the GitHub API.
* NOTE: If organization, it will be returned with the structure of a normal user; use `getOrganization` if you specifically want an organization!
* @param user The user/organization to get
* @param onError Error Callback
* @return User/Organization
* @param user The user/organization to get.
* @param onError Error Callback.
* @return User/Organization.
*/
public static function getUser(user:String, ?onError:Exception->Void):GitHubUser {
#if GITHUB_API
try {
var url = 'https://api.github.com/users/$user';
var data = Json.parse(HttpUtil.requestText(url));
if (Reflect.hasField(data, "documentation_url"))
throw __parseGitHubException(data);
var data = Json.parse(HttpUtil.requestText('https://api.github.com/users/$user'));
if (Reflect.hasField(data, "documentation_url")) throw __parseGitHubException(data);
return data;
} catch(e) {
@@ -0,0 +1,5 @@
package funkin.backend.system.interfaces;
interface IBeatCancellableReceiver extends IBeatReceiver {
public var cancelConductorUpdate:Bool;
}
@@ -1,68 +0,0 @@
package funkin.backend.system.macros;
using StringTools;
#if macro
class BuildInfo {
public static function printBuildInfo() {
if(haxe.macro.Context.defined("display") || haxe.macro.Context.defined("display-details")) return;
var haxeVersion = haxe.macro.Context.definedValue("haxe").trim();
var sleepChangeVersion = false;
Sys.println('[ BUILD INFO ]');
Sys.println('Haxe Version: ${haxeVersion}');
try {
var lastBuiltWith:Null<String> = null;
var compiling = #if final "release" #elseif debug "debug" #else "release" #end;
var target = #if hl "hl"
#elseif html5 "html5"
#elseif ios "ios"
#elseif android "android"
#elseif windows "windows"
#elseif (mac || macos) "macos"
#elseif linux "linux"
#else ""
#end;
if(target == "") throw "Unknown target";
var exportPath = Sys.getCwd() + "/export/" + compiling + "/" + target + "/";
exportPath += "obj/Options.txt";
var options = sys.io.File.getContent(exportPath);
for(option in options.split("\n")) {
if(option.startsWith("haxe=")) {
lastBuiltWith = option.substr(5).trim();
break;
}
}
if(lastBuiltWith != null && lastBuiltWith.length > 0 && lastBuiltWith != haxeVersion) {
Sys.println('Last Built With Haxe: ${lastBuiltWith} [!!!! MAKE SURE IF YOU SWITCHED VERSIONS YOU DELETE EXPORT FOLDERS !!!!]');
sleepChangeVersion = true;
}
} catch(e) {}
var targetPlatform = #if html5 "Web (HTML5)"
#elseif ios "iOS"
#elseif android "Android"
#elseif windows "Windows"
#elseif (mac || macos) "Mac"
#elseif linux "Linux"
#else "Unknown"
#end;
if(haxe.macro.Context.defined("hl")) {
targetPlatform = "Hashlink (" + targetPlatform + ")";
}
Sys.println('Target Platform: ' + targetPlatform);
Sys.println('Build Date: ${Date.now().toString()}');
Sys.println('');
if(sleepChangeVersion) {
Sys.println('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
Sys.println('!!!! MAKE SURE IF YOU SWITCHED VERSIONS YOU DELETE EXPORT FOLDERS !!!!');
Sys.println('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
Sys.println('');
Sys.sleep(5);
}
}
}
#end
@@ -33,11 +33,9 @@ class FlagMacro {
resetExprs.push(macro $i{"customFlags"} = $v{[]});
for (field in fields) {
var skip = field.meta.hasMeta(":bypass");
if (field.meta.hasMeta(":bypass")) continue;
var hasLazy = field.meta.hasMeta(":lazy");
if (skip) continue;
switch (field.kind) {
case FVar(type, expr):
var isNullable = false;
@@ -43,7 +43,6 @@ class FunkinSaveMacro {
* SAVE FUNCTION
*/
var saveFuncBlocks:Array<Expr> = [for(f in fieldNames) macro $i{saveFieldName}.data.$f = $i{f}];
saveFuncBlocks.push(macro $i{saveFieldName}.flush());
fields.push({
@@ -59,6 +58,8 @@ class FunkinSaveMacro {
access: [APublic, AStatic]
});
var loadFuncBlocks:Array<Expr> = [for(f in fieldNames) macro if ($i{saveFieldName}.data.$f != null) $i{f} = $i{saveFieldName}.data.$f];
/**
* LOAD FUNCTION
*/
@@ -69,10 +70,7 @@ class FunkinSaveMacro {
args: [],
expr: {
pos: Context.currentPos(),
expr: EBlock([for(f in fieldNames)
macro if ($i{saveFieldName}.data.$f != null)
$i{f} = $i{saveFieldName}.data.$f
])
expr: EBlock(loadFuncBlocks)
}
}),
access: [APublic, AStatic]
@@ -24,7 +24,11 @@ class UpdateAvailableScreen extends MusicBeatState {
public function new(check:UpdateCheckCallback) {
super();
this.check = check;
if (Date.now().getTime() - check.date.getTime() > 15000) {
if ((check = UpdateUtil.checkForUpdates(true)).newUpdate) this.check = check;
}
}
public override function create() {
@@ -56,7 +56,7 @@ class UpdateScreen extends MusicBeatState {
generalProgress.alignment = CENTER;
add(generalProgress);
overSound = FlxG.sound.load(Paths.sound(Flags.DEFAULT_GAMEOVER_RETRY_SFX));
overSound = FlxG.sound.load(Paths.sound(Flags.DEFAULT_GAMEOVEREND_SOUND));
updater.execute();

Some files were not shown because too many files have changed in this diff Show More