diff --git a/.gitignore b/.gitignore index 54c6746..08cc4bc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,11 +3,11 @@ help.rtf # Build stuff generated by GM. -source.gmx/Configs/Default/* +jtool.gmx/Configs/Default/* # Don't include extensions # (links to downloads should be in github readme and doc pages) -#source.gmx/extensions +jtool.gmx/extensions # Folder for my personal tidbits like todo.txt, # sketches of ideas, map files, etc. @@ -16,3 +16,331 @@ not in repo # Generated by jtool config.ini startup.jmap + +# Rust +libjtool/target/ +**/*.rs.bk + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# TypeScript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog \ No newline at end of file diff --git a/libjtool/Cargo.lock b/libjtool/Cargo.lock new file mode 100644 index 0000000..1fa324a --- /dev/null +++ b/libjtool/Cargo.lock @@ -0,0 +1,34 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "cfg-if" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libjtool" +version = "1.0.2" +dependencies = [ + "rust-ini 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "log" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rust-ini" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[metadata] +"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" +"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" +"checksum rust-ini 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "22dab655e8122ccb15db25a56852ce62506f1486cdefd37e86371bf34ea8f601" diff --git a/libjtool/Cargo.toml b/libjtool/Cargo.toml new file mode 100644 index 0000000..35da935 --- /dev/null +++ b/libjtool/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "libjtool" +version = "1.0.2" +authors = ["Starz0r "] + +[dependencies] +rust-ini = "0.10.2" + +[lib] +crate-type = ["dylib", "cdylib"] diff --git a/libjtool/src/fs.rs b/libjtool/src/fs.rs new file mode 100644 index 0000000..952d211 --- /dev/null +++ b/libjtool/src/fs.rs @@ -0,0 +1,245 @@ +use std::cell::{Cell, RefCell}; +use std::collections::HashMap; +use std::ffi::{CStr, CString, OsStr}; +use std::fs::{copy, create_dir, remove_file, File, OpenOptions}; +use std::io::{self, BufRead, BufReader, BufWriter, Read, Write}; +use std::os::raw::c_char; +use std::path::Path; + +thread_local! { + static NEXT_ID: Cell = Cell::new(0); + static FILES: RefCell>> = RefCell::new(HashMap::new()); + + static LINE: Cell> = Cell::new(None); +} + +#[no_mangle] +pub unsafe extern "C" fn file_text_open_read(path: *const c_char) -> f64 { + let mut options = OpenOptions::new(); + options.read(true); + let id = match open(path, options) { + Ok(id) => id, + Err(_) => return -1.0, + }; + + id as f64 +} + +#[no_mangle] +pub unsafe extern "C" fn file_text_open_write(path: *const c_char) -> f64 { + let mut options = OpenOptions::new(); + options.write(true).create(true); + let id = match open(path, options) { + Ok(id) => id, + Err(_) => return -1.0, + }; + + id as f64 +} + +#[no_mangle] +pub unsafe extern "C" fn file_text_open_append(path: *const c_char) -> f64 { + let mut options = OpenOptions::new(); + options.write(true).append(true).create(true); + let id = match open(path, options) { + Ok(id) => id, + Err(_) => return -1.0, + }; + + id as f64 +} + +unsafe fn open(path: *const c_char, options: OpenOptions) -> io::Result { + let path = CStr::from_ptr(path) + .to_str() + .map_err(|_| io::ErrorKind::InvalidInput)?; + + let file = options.open(path)?; + let stream = BufStream::new(file); + + let id = NEXT_ID.with(|next_id| { + let id = next_id.get(); + next_id.set(id + 1); + id + }); + + FILES.with(|files| { + files.borrow_mut().insert(id, stream); + }); + + Ok(id) +} + +#[no_mangle] +pub extern "C" fn file_text_close(id: f64) { + let id = id as i32; + + FILES.with(|files| { + let mut files = files.borrow_mut(); + files.remove(&id); + }); +} + +#[no_mangle] +pub unsafe extern "C" fn file_text_read_string(id: f64) -> *const c_char { + let id = id as i32; + + let mut line = LINE.with(|line| line.take().unwrap_or_default().into_bytes_with_nul()); + line.clear(); + + let _: io::Result<()> = FILES.with(|files| { + let mut files = files.borrow_mut(); + let file = files.get_mut(&id).ok_or(io::ErrorKind::InvalidInput)?; + + file.read_until(b'\n', &mut line)?; + + Ok(()) + }); + + let string = CString::from_vec_unchecked(line); + let ptr = string.as_ptr(); + LINE.with(|line| { + line.set(Some(string)); + }); + + ptr +} + +#[no_mangle] +pub unsafe extern "C" fn file_text_write_string(id: f64, line: *const c_char) -> f64 { + let line = CStr::from_ptr(line).to_bytes(); + write(id, line) +} + +#[no_mangle] +pub unsafe extern "C" fn file_text_writeln(id: f64) -> f64 { + let mut res: f64 = -1.0; + + // Windows CRLF + if cfg!(target_os = "windows") { + res = write(id, &[0x0D, 0x0A]); + } + //Macintosh CR + else if cfg!(target_os = "macos") { + res = write(id, &[0x0D]); + } + // GNU/Linux LR + else if cfg!(target_os = "linux") { + res = write(id, &[0x0A]); + } + + res +} + +unsafe fn write(id: f64, bytes: &[u8]) -> f64 { + let id = id as i32; + + let result: io::Result = FILES.with(|files| { + let mut files = files.borrow_mut(); + let file = files.get_mut(&id).ok_or(io::ErrorKind::InvalidInput)?; + + file.write_all(bytes)?; + + Ok(bytes.len() as f64) + }); + + result.unwrap_or(-1.0) +} + +#[no_mangle] +pub unsafe extern "C" fn file_copy(from: *const c_char, to: *const c_char) -> f64 { + copy( + OsStr::new(CStr::from_ptr(from).to_str().unwrap()), + OsStr::new(CStr::from_ptr(to).to_str().unwrap()), + ) + .unwrap(); + + 0.0f64 +} + +#[no_mangle] +pub unsafe extern "C" fn file_delete(path: *const c_char) -> f64 { + match remove_file(OsStr::new(CStr::from_ptr(path).to_str().unwrap())) { + Ok(()) => return 1.0, + Err(_) => return 0.0, + } +} + +#[no_mangle] +pub unsafe extern "C" fn directory_exists(path: *const c_char) -> f64 { + let result = match Path::new(OsStr::new(CStr::from_ptr(path).to_str().unwrap())).exists() { + true => return 1.0, + false => return 0.0, + }; +} + +#[no_mangle] +pub unsafe extern "C" fn file_exists(path: *const c_char) -> f64 { + return directory_exists(path); +} + +#[no_mangle] +pub unsafe extern "C" fn directory_create(path: *const c_char) -> f64 { + create_dir(OsStr::new(CStr::from_ptr(path).to_str().unwrap())).unwrap(); + + return 0.0; +} + +struct BufStream { + reader: BufReader>, +} + +struct InternalBufWriter { + writer: BufWriter, +} + +impl BufStream { + fn new(stream: S) -> BufStream { + let writer = InternalBufWriter::new(stream); + let reader = BufReader::new(writer); + BufStream { reader } + } +} + +impl InternalBufWriter { + fn new(stream: S) -> InternalBufWriter { + let writer = BufWriter::new(stream); + InternalBufWriter { writer } + } +} + +impl BufRead for BufStream { + fn fill_buf(&mut self) -> io::Result<&[u8]> { + self.reader.fill_buf() + } + fn consume(&mut self, amt: usize) { + self.reader.consume(amt) + } + fn read_until(&mut self, byte: u8, buf: &mut Vec) -> io::Result { + self.reader.read_until(byte, buf) + } + fn read_line(&mut self, string: &mut String) -> io::Result { + self.reader.read_line(string) + } +} + +impl Read for BufStream { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + self.reader.read(buf) + } +} + +impl Write for BufStream { + fn write(&mut self, buf: &[u8]) -> io::Result { + self.reader.get_mut().writer.write(buf) + } + fn flush(&mut self) -> io::Result<()> { + self.reader.get_mut().writer.flush() + } +} + +impl Read for InternalBufWriter { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + self.writer.get_mut().read(buf) + } +} diff --git a/libjtool/src/ini.rs b/libjtool/src/ini.rs new file mode 100644 index 0000000..98170f6 --- /dev/null +++ b/libjtool/src/ini.rs @@ -0,0 +1,139 @@ +extern crate ini as rust_ini; + +use self::rust_ini::ini; +use std::cell::RefCell; +use std::ffi::{CStr, CString, OsStr}; +use std::fs::File; +use std::mem::drop; +use std::os::raw::c_char; +use std::path::Path; + +thread_local! { + static INI_G: RefCell = RefCell::new(ini::Ini::new()); + static PATH_G: RefCell = RefCell::new(String::new()); +} + +#[no_mangle] +pub unsafe extern "C" fn ini_open(path: *const c_char) -> f64 { + if (Path::new(OsStr::new(CStr::from_ptr(path).to_str().unwrap())).exists() == false) { + File::create(OsStr::new(CStr::from_ptr(path).to_str().unwrap())); + } + + // Load the INI file and store it + INI_G.with(|f| { + PATH_G.with(|p| { + *f.borrow_mut() = + ini::Ini::load_from_file(OsStr::new(CStr::from_ptr(path).to_str().unwrap())) + .unwrap(); + *p.borrow_mut() = CStr::from_ptr(path).to_str().unwrap().to_string(); + }) + }); + + // Return Successful + return 1.0; +} + +#[no_mangle] +pub unsafe extern "C" fn ini_read_string( + section: *const c_char, + key: *const c_char, + default: *const c_char, +) -> *const c_char { + INI_G.with(|f| { + let f = f.borrow_mut(); + let result = f + .get_from( + Some(CStr::from_ptr(section).to_str().unwrap()), + CStr::from_ptr(key).to_str().unwrap(), + ) + .unwrap_or(CStr::from_ptr(default).to_str().unwrap()); + CString::new(result).unwrap().into_raw() + }) +} + +#[no_mangle] +pub unsafe extern "C" fn ini_read_real( + section: *const c_char, + key: *const c_char, + default: f64, +) -> f64 { + INI_G.with(|f| { + let f = f.borrow_mut(); + let default = &mut default.to_string(); + let result = f + .get_from( + Some(CStr::from_ptr(section).to_str().unwrap()), + CStr::from_ptr(key).to_str().unwrap(), + ) + .unwrap_or(default); + + let result: f64 = result.parse().unwrap(); + result + }) +} + +#[no_mangle] +pub unsafe extern "C" fn ini_write_string( + section: *const c_char, + key: *const c_char, + value: *const c_char, +) -> f64 { + INI_G.with(|f| { + PATH_G.with(|p| { + // Borrow Mutabily and set Key Value + let mut conf = f.borrow_mut(); + conf.with_section(Some(CStr::from_ptr(section).to_str().unwrap()).to_owned()) + .set( + CStr::from_ptr(key).to_str().unwrap(), + CStr::from_ptr(value).to_str().unwrap(), + ); + + // Write to the file + let path = &*p.borrow_mut(); + let ospath = OsStr::new(&path); + conf.write_to_file(ospath).unwrap(); + + // Return N/A + 0.0 + }) + }) +} + +#[no_mangle] +pub unsafe extern "C" fn ini_write_real( + section: *const c_char, + key: *const c_char, + value: f64, +) -> f64 { + INI_G.with(|f| { + PATH_G.with(|p| { + // Borrow Mutabily and set Key Value + let mut conf = f.borrow_mut(); + conf.with_section(Some(CStr::from_ptr(section).to_str().unwrap()).to_owned()) + .set(CStr::from_ptr(key).to_str().unwrap(), value.to_string()); + + // Write to the file + let path = &*p.borrow_mut(); + let ospath = OsStr::new(&path); + conf.write_to_file(ospath).unwrap(); + + // Return N/A + 0.0 + }) + }) +} + +#[no_mangle] +pub unsafe extern "C" fn ini_close(path: *const c_char) -> *const c_char { + // Retrieve the INI file from memory + INI_G.with(|f| { + let mut conf = &*f.borrow_mut(); + let mut result = String::new(); + + // Deallocate by dropping + drop(conf); + + // Return the INI String + CString::new(result).unwrap().into_raw() + }) +} diff --git a/libjtool/src/lib.rs b/libjtool/src/lib.rs new file mode 100644 index 0000000..19424a3 --- /dev/null +++ b/libjtool/src/lib.rs @@ -0,0 +1,22 @@ +#![crate_type = "lib"] +mod ini; +pub use self::ini::ini_close; +pub use self::ini::ini_open; +pub use self::ini::ini_read_real; +pub use self::ini::ini_read_string; +pub use self::ini::ini_write_real; +pub use self::ini::ini_write_string; + +mod fs; +pub use self::fs::directory_create; +pub use self::fs::directory_exists; +pub use self::fs::file_copy; +pub use self::fs::file_delete; +pub use self::fs::file_exists; +pub use self::fs::file_text_close; +pub use self::fs::file_text_open_append; +pub use self::fs::file_text_open_read; +pub use self::fs::file_text_open_write; +pub use self::fs::file_text_read_string; +pub use self::fs::file_text_write_string; +pub use self::fs::file_text_writeln; diff --git a/source.gmx/Configs/Default.config.gmx b/source.gmx/Configs/Default.config.gmx index 9c9e8e5..c5e9891 100644 --- a/source.gmx/Configs/Default.config.gmx +++ b/source.gmx/Configs/Default.config.gmx @@ -301,6 +301,24 @@ Configs\Default\ios\icons\icon57.png Configs\Default\ios\icons\icon72.png Configs\Default\ios\icons\icon76.png + Configs\Default\ios\icons\app\ipad_152.png + Configs\Default\ios\icons\app\ipad_76.png + Configs\Default\ios\icons\notification\ipad_20.png + Configs\Default\ios\icons\notification\ipad_40.png + Configs\Default\ios\icons\app\ipad_pro_167.png + Configs\Default\ios\icons\settings\ipad_29.png + Configs\Default\ios\icons\settings\ipad_58.png + Configs\Default\ios\icons\spotlight\ipad_40.png + Configs\Default\ios\icons\spotlight\ipad_80.png + Configs\Default\ios\icons\app\iphone_120.png + Configs\Default\ios\icons\app\iphone_180.png + Configs\Default\ios\icons\notification\iphone_40.png + Configs\Default\ios\icons\notification\iphone_60.png + Configs\Default\ios\icons\settings\iphone_58.png + Configs\Default\ios\icons\settings\iphone_87.png + Configs\Default\ios\icons\spotlight\iphone_120.png + Configs\Default\ios\icons\spotlight\iphone_80.png + Configs\Default\ios\icons\itunes\itunes_1024.png -1 Configs\Default\ios\iPadRetinasplash.png Configs\Default\ios\iPadRetinasplashPortrait.png @@ -312,10 +330,22 @@ Configs\Default\ios\iPhone6splashPortrait.png Configs\Default\ios\iPhone6Plussplash.png Configs\Default\ios\iPhone6PlussplashPortrait.png + Configs\Default\ios\iPhone7splash.png + Configs\Default\ios\iPhone7splashPortrait.png + Configs\Default\ios\iPhone7Plussplash.png + Configs\Default\ios\iPhone7PlussplashPortrait.png + Configs\Default\ios\iPhone8splash.png + Configs\Default\ios\iPhone8splashPortrait.png + Configs\Default\ios\iPhone8Plussplash.png + Configs\Default\ios\iPhone8PlussplashPortrait.png Configs\Default\ios\IphoneRetinasplash.png Configs\Default\ios\IphoneRetinasplashPortrait.png Configs\Default\ios\iPhonesplash.png Configs\Default\ios\iPhonesplashPortrait.png + Configs\Default\ios\iPhonesesplash.png + Configs\Default\ios\iPhonesesplashPortrait.png + Configs\Default\ios\iPhonexsplash.png + Configs\Default\ios\iPhonexsplashPortrait.png 1 0 -1 diff --git a/source.gmx/Configs/Default.config.gmx.bak b/source.gmx/Configs/Default.config.gmx.bak new file mode 100644 index 0000000..b6e9df3 --- /dev/null +++ b/source.gmx/Configs/Default.config.gmx.bak @@ -0,0 +1,689 @@ + + + + False + 0 + 0 + 0 + 0 + + MoPub + 0 + 0 + -1 + -1 + 0 + 0 + 0 + True + True + True + false + false + True + 23.0.1 + 0 + 0 + 23 + basic_guy + + + 0 + 0 + 0 + false + 0 + 0 + 0 + + + false + -1 + Configs\Default\android\icons\icon_hdpi.png + Configs\Default\android\icons\icon_ldpi.png + Configs\Default\android\icons\icon_mdpi.png + Configs\Default\android\icons\icon_xhdpi.png + Configs\Default\android\icons\icon_xxhdpi.png + Configs\Default\android\icons\icon_xxxhdpi.png + auto + -1 + 0 + + -1 + 1 + 9 + 0 + 0 + 0 + 0 + True + True + True + True + 2 + Configs\Default\android\icons\ouyaIcon.png + companyname + com + basic_guy + 8 + 0 + + 0 + Configs\Default\android\portrait_splash.png + 0 + + -1 + + 4 + Configs\Default\android\splash.png + 0 + 23.1.1 + 16 + 1024 + 0 + 0 + false + false + + MoPub + 0 + true + true + false + false + false + True + True + True + false + false + True + Configs\Default\amazonfire\icons\background.png + Configs\Default\amazonfire\icons\banner.png + 23.0.1 + 0 + 0 + 23 + jtool + + + false + false + 0 + 0 + + false + Configs\Default\amazonfire\icons\icon_hdpi.png + Configs\Default\amazonfire\icons\icon_ldpi.png + Configs\Default\amazonfire\icons\icon_mdpi.png + Configs\Default\amazonfire\icons\icon_xhdpi.png + Configs\Default\amazonfire\icons\icon_xxhdpi.png + Configs\Default\amazonfire\icons\icon_xxxhdpi.png + auto + true + true + Configs\Default\amazonfire\icons\large_icon.png + false + + 0 + 1 + 9 + 0 + 0 + True + True + True + True + companyname + com + jtool + 8 + Configs\Default\amazonfire\portrait_splash.png + 0 + + -1 + + Configs\Default\amazonfire\icons\small_icon.png + Configs\Default\amazonfire\splash.png + 0 + 23.1.1 + 23 + 1024 + false + 0 + false + false + + MoPub + 0 + true + true + false + false + 0 + True + True + True + false + false + True + Configs\Default\androidtv\icons\background.png + Configs\Default\androidtv\icons\banner.png + 23.0.1 + 0 + 0 + 23 + jtool + + + 0 + false + 0 + 0 + + false + Configs\Default\androidtv\icons\icon_hdpi.png + Configs\Default\androidtv\icons\icon_ldpi.png + Configs\Default\androidtv\icons\icon_mdpi.png + Configs\Default\androidtv\icons\icon_xhdpi.png + Configs\Default\androidtv\icons\icon_xxhdpi.png + Configs\Default\androidtv\icons\icon_xxxhdpi.png + auto + true + -1 + Configs\Default\androidtv\icons\large_icon.png + 0 + + -1 + 1 + 0 + 0 + companyname + com + jtool + 8 + 0 + + -1 + + Configs\Default\androidtv\icons\small_icon.png + Configs\Default\androidtv\splash.png + 23.1.1 + 1024 + false + True + 1 + patrickgh3, Redire, Starz0r + nil + False + false + false + true + 0 + jtool + True + 0 + + + 0 +<<<<<<< HEAD:jtool.gmx/Configs/Default.config.gmx + False +======= + false +>>>>>>> upstream/master:source.gmx/Configs/Default.config.gmx + false + 0 + nil + False + {D99E6CF2-A2C0-4C4B-85AF-736453D03D94} + 546129257 + 0 + false + true + true + 0 + 0 + + Supersonic Ads + True + False + Created with GameMaker:Studio + False + + + 0 + 0 + + html5game + 0 + 0 + + Configs\Default\html5\fav.ico + -1 + -1 + + -1 + True + False + index.html + -1 + True + Configs\Default\html5\splash.png + 2048 + 0 + True + False + nil + 0 + 0 + + + False + 0 + 0 + + iAds + + 0 + < Press refresh to fetch certificate list from Mac> + 3 + basic_guy + + + 0 + false + + false + + + 0 + Configs\Default\ios\icons\icon114.png + Configs\Default\ios\icons\icon120.png + Configs\Default\ios\icons\icon144.png + Configs\Default\ios\icons\icon152.png + Configs\Default\ios\icons\icon167.png + Configs\Default\ios\icons\icon57.png + Configs\Default\ios\icons\icon72.png + Configs\Default\ios\icons\icon76.png + -1 + Configs\Default\ios\iPadRetinasplash.png + Configs\Default\ios\iPadRetinasplashPortrait.png + Configs\Default\ios\iPadsplash.png + Configs\Default\ios\iPadsplashPortrait.png + Configs\Default\ios\iPhone5splash.png + Configs\Default\ios\iPhone5splashPortrait.png + Configs\Default\ios\iPhone6splash.png + Configs\Default\ios\iPhone6splashPortrait.png + Configs\Default\ios\iPhone6Plussplash.png + Configs\Default\ios\iPhone6PlussplashPortrait.png + Configs\Default\ios\IphoneRetinasplash.png + Configs\Default\ios\IphoneRetinasplashPortrait.png + Configs\Default\ios\iPhonesplash.png + Configs\Default\ios\iPhonesplashPortrait.png + 1 + 0 + -1 + -1 + -1 + -1 + < Press refresh to fetch provisioning list from Mac> + 0 + -1 + + Configs\Default\ios\splash.png + 0 + + 1024 + 0 + + basic_guy + 0 + 0 + http://www.jtool.com + Configs\Default\linux\icon64.png + -1 + jtool + + -1 + -1 + jtool + 0 + Configs\Default\linux\splash.png + 0 + 0 + 2048 + 0 + 1 + 0 + 255 + nil + false + + + 0 + 0 + 0 + (c)2012 CompanyName Ltd... + -1 + basic_guy + 0 + 0 + 0 + Configs\Default\mac\icon512.png + -1 + 1 + 0 + 0 + ~/GameMaker-Studio/basic_guy + -1 + -1 + -1 + Developer ID Application: + 0 + Configs\Default\mac\splash.png + 0 + 0 + + 2048 + false + false + true + 0 + 0 + 0 + -1 + 1 + 0 + + Memo1 + Memo1 + + + 0 + 0 + 2048 + 1.00 + 0 + 0 + -1 + 1 + 0 + + Memo1 + + + 0 + 0 + 2048 + 0 + 0 + -1 + 1 + 0 + + Memo1 + Memo1 + + + 0 + 0 + 0 + 2048 + true + 0 + true + 0 + true + 0 + + False + true + True + True + 1 + False + false + 0 + 2 + 0 + <none> + 0 + 9223372036854775807 + 0 + 0 + 1 + Default + http://yourdomain/basic_guy + 0 + basic_guy + 0 + + 0 + + + Configs\Default\tizen\icon117.png + -1 + 1 + 0 + + 0 + 0 + 0 + Configs\Default\tizen\splash.png + 1024 + False + + 0 + < Press refresh to fetch certificate list from Mac> + source + Configs\Default\tvos\icons\icon1280.png + Configs\Default\tvos\icons\icon400.png + -1 + 1 + 0 + -1 + Configs\Default\tvos\splash.png + 0 + 2048 + False + True + False + 1.4.0 + 0 + + + dude it's jtool + 1 + 4 + + 0 + + 0 + + 0 + + 0 + + 0 + Windows8_TemporaryKey.pfx + basic_guy + 0 + -1 + -1 + -1 + Configs\Default\Windows8\logos\logo150.png + #000000 + light + 1 + 0 + 0 + Win8NativeRunner_TemporaryKey.pfx + x86 + YourPackageDisplayName + YourPackageName + -1 + -1 + YourPublisherName + CN=YoyoGames + 0 + false + 0 + Configs\Default\Windows8\logos\logo30.png + #000000 + Configs\Default\Windows8\splashscreen.png + Configs\Default\Windows8\logos\logo50.png + 1024 + Configs\Default\Windows8\logos\logo310.png +<<<<<<< HEAD:jtool.gmx/Configs/Default.config.gmx + 0 + 0 + WinUWPRunner_TemporaryKey.pfx + jtool + 0 +======= + false + 0 + WinUWPRunner_TemporaryKey.pfx + jtool + false +>>>>>>> upstream/master:source.gmx/Configs/Default.config.gmx + 0 + -1 + -1 + -1 + Configs\Default\WindowsUAP\logos\LargeLogo.scale-100.png + Configs\Default\WindowsUAP\logos\Logo.scale-100.png + #000000 + light + 1 + 0 + 0 + x86 + YourPackageDisplayName + YourPackageName + -1 + -1 + YourPublisherName + CN=Sandbox + 0 + false + 0 + Configs\Default\WindowsUAP\logos\SmallLogo.scale-100.png + Configs\Default\WindowsUAP\logos\SmallishLogo.scale-100.png + #000000 + Configs\Default\WindowsUAP\SplashScreen.scale-100.png + Configs\Default\WindowsUAP\logos\StoreLogo.scale-100.png + 1024 + Configs\Default\WindowsUAP\logos\WideLogo.scale-100.png + clBlack + False + 0 + + + False + dude it's jtool + 0 + Configs\Default\windows\runner_icon.ico + Configs\Default\windows\License.txt + 4 + 1 + Configs\Default\windows\RunnerInstaller.nsi + + 0 + Configs\Default\windows\Runner_finish.bmp + Configs\Default\windows\Runner_header.bmp + 0 + 1 + #000000 + Configs\Default\windows\splash.png + 0 + 2048 + 0 + 1 + Configs\Default\WinPhone\SplashScreenImage480.jpg + Configs\Default\WinPhone\SplashScreenImage720.jpg + Configs\Default\WinPhone\SplashScreenImage.jpg + + 0 + + 0 + + You + 0 + Configs\Default\WinPhone\CycleSmall.png + Configs\Default\WinPhone\CycleWide1.png + Configs\Default\WinPhone\CycleWide2.png + Configs\Default\WinPhone\CycleWide3.png + Configs\Default\WinPhone\CycleWide4.png + Configs\Default\WinPhone\CycleWide5.png + Configs\Default\WinPhone\CycleWide6.png + Configs\Default\WinPhone\CycleWide7.png + Configs\Default\WinPhone\CycleWide8.png + Configs\Default\WinPhone\CycleWide9.png + YourDescription + basic_guy + + + Configs\Default\WinPhone\FlipMedBack.png + Configs\Default\WinPhone\FlipMedFront.png + FlipSmallBack.png + Configs\Default\WinPhone\FlipSmallFront.png + Configs\Default\WinPhone\FlipWideBack.png + Configs\Default\WinPhone\FlipWideFront.png + 0 + + 1 + 0 + + Configs\Default\WinPhone\ApplicationIcon.png + #000000 + + Configs\Default\WinPhone\IconicSmall.png + + + + Configs\Default\WinPhone\IconicWide.png + -1 + -1 + -1 + 1 + 0 + -1 + YourPublisherName + f47823f0-220d-459a-bf68-b6ea984b24a8 + -1 + 0 + -1 + -1 + -1 + -1 + 1024 + 0 + False + #FFFFFF + 0 + + + -1 + light + -1 + "<!-- Insert the languages your title supports here -->","<!-- os_get_language will only return languages that are listed -->","<!-- ""en"" is supported by default -->","<!-- Resource Language=""en-us""/ -->" + 0 + 0 + + + + + "<mx:Ratings Category=""game"">","<!-- Insert your title ratings here -->","<!-- See ""Title Ratings for Xbox One"" white paper -->","<!-- from developer.xboxlive.com for details -->",</mx:Ratings> + False + False + True + 0 + -1 + + #FFFFFF + 1024 + + + + diff --git a/source.gmx/Configs/Default/Android/icons/icon_hdpi.png b/source.gmx/Configs/Default/Android/icons/icon_hdpi.png new file mode 100644 index 0000000..ded177e Binary files /dev/null and b/source.gmx/Configs/Default/Android/icons/icon_hdpi.png differ diff --git a/source.gmx/Configs/Default/Android/icons/icon_ldpi.png b/source.gmx/Configs/Default/Android/icons/icon_ldpi.png new file mode 100644 index 0000000..edf85a0 Binary files /dev/null and b/source.gmx/Configs/Default/Android/icons/icon_ldpi.png differ diff --git a/source.gmx/Configs/Default/Android/icons/icon_mdpi.png b/source.gmx/Configs/Default/Android/icons/icon_mdpi.png new file mode 100644 index 0000000..a6f63db Binary files /dev/null and b/source.gmx/Configs/Default/Android/icons/icon_mdpi.png differ diff --git a/source.gmx/Configs/Default/Android/icons/icon_xhdpi.png b/source.gmx/Configs/Default/Android/icons/icon_xhdpi.png new file mode 100644 index 0000000..19049f5 Binary files /dev/null and b/source.gmx/Configs/Default/Android/icons/icon_xhdpi.png differ diff --git a/source.gmx/Configs/Default/Android/icons/icon_xxhdpi.png b/source.gmx/Configs/Default/Android/icons/icon_xxhdpi.png new file mode 100644 index 0000000..efc628d Binary files /dev/null and b/source.gmx/Configs/Default/Android/icons/icon_xxhdpi.png differ diff --git a/source.gmx/Configs/Default/Android/icons/icon_xxxhdpi.png b/source.gmx/Configs/Default/Android/icons/icon_xxxhdpi.png new file mode 100644 index 0000000..72d7d3c Binary files /dev/null and b/source.gmx/Configs/Default/Android/icons/icon_xxxhdpi.png differ diff --git a/source.gmx/Configs/Default/Android/icons/ouyaIcon.png b/source.gmx/Configs/Default/Android/icons/ouyaIcon.png new file mode 100644 index 0000000..6ef7d2d Binary files /dev/null and b/source.gmx/Configs/Default/Android/icons/ouyaIcon.png differ diff --git a/source.gmx/Configs/Default/Android/portrait_splash.png b/source.gmx/Configs/Default/Android/portrait_splash.png new file mode 100644 index 0000000..aefc3c5 Binary files /dev/null and b/source.gmx/Configs/Default/Android/portrait_splash.png differ diff --git a/source.gmx/Configs/Default/Android/splash.png b/source.gmx/Configs/Default/Android/splash.png new file mode 100644 index 0000000..75cc0f7 Binary files /dev/null and b/source.gmx/Configs/Default/Android/splash.png differ diff --git a/source.gmx/Configs/Default/HTML5/fav.ico b/source.gmx/Configs/Default/HTML5/fav.ico new file mode 100644 index 0000000..1dd04b4 Binary files /dev/null and b/source.gmx/Configs/Default/HTML5/fav.ico differ diff --git a/source.gmx/Configs/Default/HTML5/splash.png b/source.gmx/Configs/Default/HTML5/splash.png new file mode 100644 index 0000000..4248cbb Binary files /dev/null and b/source.gmx/Configs/Default/HTML5/splash.png differ diff --git a/source.gmx/Configs/Default/Linux/icon64.png b/source.gmx/Configs/Default/Linux/icon64.png new file mode 100644 index 0000000..58d096e Binary files /dev/null and b/source.gmx/Configs/Default/Linux/icon64.png differ diff --git a/source.gmx/Configs/Default/Linux/splash.png b/source.gmx/Configs/Default/Linux/splash.png new file mode 100644 index 0000000..f56c9f8 Binary files /dev/null and b/source.gmx/Configs/Default/Linux/splash.png differ diff --git a/source.gmx/Configs/Default/Mac/icon512.png b/source.gmx/Configs/Default/Mac/icon512.png new file mode 100644 index 0000000..e528625 Binary files /dev/null and b/source.gmx/Configs/Default/Mac/icon512.png differ diff --git a/source.gmx/Configs/Default/Mac/splash.png b/source.gmx/Configs/Default/Mac/splash.png new file mode 100644 index 0000000..8ebb8ca Binary files /dev/null and b/source.gmx/Configs/Default/Mac/splash.png differ diff --git a/source.gmx/Configs/Default/Windows8/logos/logo150.png b/source.gmx/Configs/Default/Windows8/logos/logo150.png new file mode 100644 index 0000000..dde18df Binary files /dev/null and b/source.gmx/Configs/Default/Windows8/logos/logo150.png differ diff --git a/source.gmx/Configs/Default/Windows8/logos/logo30.png b/source.gmx/Configs/Default/Windows8/logos/logo30.png new file mode 100644 index 0000000..9e363f9 Binary files /dev/null and b/source.gmx/Configs/Default/Windows8/logos/logo30.png differ diff --git a/source.gmx/Configs/Default/Windows8/logos/logo310.png b/source.gmx/Configs/Default/Windows8/logos/logo310.png new file mode 100644 index 0000000..80d6a03 Binary files /dev/null and b/source.gmx/Configs/Default/Windows8/logos/logo310.png differ diff --git a/source.gmx/Configs/Default/Windows8/logos/logo50.png b/source.gmx/Configs/Default/Windows8/logos/logo50.png new file mode 100644 index 0000000..2cd17b1 Binary files /dev/null and b/source.gmx/Configs/Default/Windows8/logos/logo50.png differ diff --git a/source.gmx/Configs/Default/Windows8/splashscreen.png b/source.gmx/Configs/Default/Windows8/splashscreen.png new file mode 100644 index 0000000..e1aca27 Binary files /dev/null and b/source.gmx/Configs/Default/Windows8/splashscreen.png differ diff --git a/source.gmx/Configs/Default/iOS/iPadRetinaSplash.png b/source.gmx/Configs/Default/iOS/iPadRetinaSplash.png new file mode 100644 index 0000000..7dad383 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPadRetinaSplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPadRetinaSplashPortrait.png b/source.gmx/Configs/Default/iOS/iPadRetinaSplashPortrait.png new file mode 100644 index 0000000..c426146 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPadRetinaSplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPadsplash.png b/source.gmx/Configs/Default/iOS/iPadsplash.png new file mode 100644 index 0000000..3dbaca7 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPadsplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPadsplashPortrait.png b/source.gmx/Configs/Default/iOS/iPadsplashPortrait.png new file mode 100644 index 0000000..aefc3c5 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPadsplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone5splash.png b/source.gmx/Configs/Default/iOS/iPhone5splash.png new file mode 100644 index 0000000..7f605cc Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone5splash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone5splashPortrait.png b/source.gmx/Configs/Default/iOS/iPhone5splashPortrait.png new file mode 100644 index 0000000..1bebb18 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone5splashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone6PlusSplash.png b/source.gmx/Configs/Default/iOS/iPhone6PlusSplash.png new file mode 100644 index 0000000..0e997c6 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone6PlusSplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone6PlusSplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhone6PlusSplashPortrait.png new file mode 100644 index 0000000..c200072 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone6PlusSplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone6Splash.png b/source.gmx/Configs/Default/iOS/iPhone6Splash.png new file mode 100644 index 0000000..34e3e79 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone6Splash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone6SplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhone6SplashPortrait.png new file mode 100644 index 0000000..0bc68ae Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone6SplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone7PlusSplash.png b/source.gmx/Configs/Default/iOS/iPhone7PlusSplash.png new file mode 100644 index 0000000..0e997c6 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone7PlusSplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone7PlusSplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhone7PlusSplashPortrait.png new file mode 100644 index 0000000..c200072 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone7PlusSplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone7Splash.png b/source.gmx/Configs/Default/iOS/iPhone7Splash.png new file mode 100644 index 0000000..34e3e79 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone7Splash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone7SplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhone7SplashPortrait.png new file mode 100644 index 0000000..0bc68ae Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone7SplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone8PlusSplash.png b/source.gmx/Configs/Default/iOS/iPhone8PlusSplash.png new file mode 100644 index 0000000..0e997c6 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone8PlusSplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone8PlusSplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhone8PlusSplashPortrait.png new file mode 100644 index 0000000..c200072 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone8PlusSplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone8Splash.png b/source.gmx/Configs/Default/iOS/iPhone8Splash.png new file mode 100644 index 0000000..34e3e79 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone8Splash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhone8SplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhone8SplashPortrait.png new file mode 100644 index 0000000..0bc68ae Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhone8SplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhoneRetinasplash.png b/source.gmx/Configs/Default/iOS/iPhoneRetinasplash.png new file mode 100644 index 0000000..cc606c4 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhoneRetinasplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhoneRetinasplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhoneRetinasplashPortrait.png new file mode 100644 index 0000000..bc2332b Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhoneRetinasplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhoneSEsplash.png b/source.gmx/Configs/Default/iOS/iPhoneSEsplash.png new file mode 100644 index 0000000..7f605cc Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhoneSEsplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhoneSEsplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhoneSEsplashPortrait.png new file mode 100644 index 0000000..1bebb18 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhoneSEsplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhoneXSplash.png b/source.gmx/Configs/Default/iOS/iPhoneXSplash.png new file mode 100644 index 0000000..d57845b Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhoneXSplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhoneXSplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhoneXSplashPortrait.png new file mode 100644 index 0000000..24400e8 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhoneXSplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhonesplash.png b/source.gmx/Configs/Default/iOS/iPhonesplash.png new file mode 100644 index 0000000..1425f78 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhonesplash.png differ diff --git a/source.gmx/Configs/Default/iOS/iPhonesplashPortrait.png b/source.gmx/Configs/Default/iOS/iPhonesplashPortrait.png new file mode 100644 index 0000000..62d072e Binary files /dev/null and b/source.gmx/Configs/Default/iOS/iPhonesplashPortrait.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/app/ipad_152.png b/source.gmx/Configs/Default/iOS/icons/app/ipad_152.png new file mode 100644 index 0000000..08dd612 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/app/ipad_152.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/app/ipad_76.png b/source.gmx/Configs/Default/iOS/icons/app/ipad_76.png new file mode 100644 index 0000000..b41922e Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/app/ipad_76.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/app/ipad_pro_167.png b/source.gmx/Configs/Default/iOS/icons/app/ipad_pro_167.png new file mode 100644 index 0000000..6ee8e4b Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/app/ipad_pro_167.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/app/iphone_120.png b/source.gmx/Configs/Default/iOS/icons/app/iphone_120.png new file mode 100644 index 0000000..3f3337d Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/app/iphone_120.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/app/iphone_180.png b/source.gmx/Configs/Default/iOS/icons/app/iphone_180.png new file mode 100644 index 0000000..27fbd05 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/app/iphone_180.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/itunes/itunes_1024.png b/source.gmx/Configs/Default/iOS/icons/itunes/itunes_1024.png new file mode 100644 index 0000000..6979be8 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/itunes/itunes_1024.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/notification/ipad_20.png b/source.gmx/Configs/Default/iOS/icons/notification/ipad_20.png new file mode 100644 index 0000000..ca89de5 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/notification/ipad_20.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/notification/ipad_40.png b/source.gmx/Configs/Default/iOS/icons/notification/ipad_40.png new file mode 100644 index 0000000..cf142cb Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/notification/ipad_40.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/notification/iphone_40.png b/source.gmx/Configs/Default/iOS/icons/notification/iphone_40.png new file mode 100644 index 0000000..ea54faf Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/notification/iphone_40.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/notification/iphone_60.png b/source.gmx/Configs/Default/iOS/icons/notification/iphone_60.png new file mode 100644 index 0000000..b1cc847 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/notification/iphone_60.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/settings/ipad_29.png b/source.gmx/Configs/Default/iOS/icons/settings/ipad_29.png new file mode 100644 index 0000000..15cc633 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/settings/ipad_29.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/settings/ipad_58.png b/source.gmx/Configs/Default/iOS/icons/settings/ipad_58.png new file mode 100644 index 0000000..ecd94e1 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/settings/ipad_58.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/settings/iphone_58.png b/source.gmx/Configs/Default/iOS/icons/settings/iphone_58.png new file mode 100644 index 0000000..fceb4ea Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/settings/iphone_58.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/settings/iphone_87.png b/source.gmx/Configs/Default/iOS/icons/settings/iphone_87.png new file mode 100644 index 0000000..aeb6236 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/settings/iphone_87.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/spotlight/ipad_40.png b/source.gmx/Configs/Default/iOS/icons/spotlight/ipad_40.png new file mode 100644 index 0000000..7c9bee8 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/spotlight/ipad_40.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/spotlight/ipad_80.png b/source.gmx/Configs/Default/iOS/icons/spotlight/ipad_80.png new file mode 100644 index 0000000..6ec9d9f Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/spotlight/ipad_80.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/spotlight/iphone_120.png b/source.gmx/Configs/Default/iOS/icons/spotlight/iphone_120.png new file mode 100644 index 0000000..8ae4109 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/spotlight/iphone_120.png differ diff --git a/source.gmx/Configs/Default/iOS/icons/spotlight/iphone_80.png b/source.gmx/Configs/Default/iOS/icons/spotlight/iphone_80.png new file mode 100644 index 0000000..079fe6d Binary files /dev/null and b/source.gmx/Configs/Default/iOS/icons/spotlight/iphone_80.png differ diff --git a/source.gmx/Configs/Default/iOS/splash.png b/source.gmx/Configs/Default/iOS/splash.png new file mode 100644 index 0000000..0b9f026 Binary files /dev/null and b/source.gmx/Configs/Default/iOS/splash.png differ diff --git a/source.gmx/Configs/Default/iOS/splashPortrait.png b/source.gmx/Configs/Default/iOS/splashPortrait.png new file mode 100644 index 0000000..b9fd91b Binary files /dev/null and b/source.gmx/Configs/Default/iOS/splashPortrait.png differ diff --git a/source.gmx/Configs/Default/windows/License.txt b/source.gmx/Configs/Default/windows/License.txt new file mode 100644 index 0000000..e24657f --- /dev/null +++ b/source.gmx/Configs/Default/windows/License.txt @@ -0,0 +1,42 @@ +This Application was made using GameMaker. GameMaker is the intellectual property of YoYo Games Ltd, a company of the United Kingdom. + +THIS END USER LICENSE AGREEMENT APPLIES TO ALL USE OF THIS APPLICATION. + +Scope +----- +You may: + +Install and use this Application for personal, or commercial use [provided you have paid any license fee, if this applies]; + +You must not: + +use, copy, transfer, distribute modify, adapt, merge, translate, decompile, disassemble, or reverse engineer the Application or part of it except as expressly permitted by this Licence; +remove, modify, or tamper with any copyright, trademark or other notice; +use the Application for any illegal, unlawful or immoral purposes. + + +Term +---- +This License will end automatically if you breach any of the terms. +When this License ends you must stop all use of the Application and destroy and erase any copies you have. + + +Liability +--------- + +YoYo Games Limited (“YoYo Games) is not involved in the creation of this Application except only that it was made using GameMaker. YoYo Games warrants only that GameMaker will function satisfactorily if used properly and on the correct operating system. +YoYo Games does not warrant that the operation of the Appication will be uninterrupted or error free or that errors can be corrected. You install and use the Application at your own risk and in no event will YoYo Games be liable to you for any loss or damage of any kind (except personal injury or death arising from YoYo Games’ negligence) including lost profits or other consequential loss arising from the use of or inability to use the Application or from errors or deficiencies in it whether caused by negligence or otherwise. +To the maximum extent permitted by law, YoYo Games Limited excludes liability for all warranties, conditions and other terms which but for this notice would have effect. + + +General +------- + +All copyright and other intellectual property rights in GameMaker and parts of it included in the Application belong to and vest in YoYo Games. All rights of YoYo Games are hereby asserted and reserved. +All trade marks are the property of their respective owners and YoYo Games makes no warranty or representation in respect of and has no responsibility and excludes all liability for any trade mark or third party content. +The rights granted in this license are non-exclusive. +This license does not affect your statutory rights as a consumer. +This License is governed by English Law and the parties submit to the exclusive jurisdiction of the English Courts. +If you have a problem with this Application please contact the person who made it, not YoYo Games. + +Click “ACCEPT” and accept these terms to install and use this Application. If you do not accept them terms you may not continue with the installation and you must not install, use or run this software on this or any other computer. diff --git a/source.gmx/Configs/Default/windows/RunnerInstaller.nsi b/source.gmx/Configs/Default/windows/RunnerInstaller.nsi new file mode 100644 index 0000000..0eb459b --- /dev/null +++ b/source.gmx/Configs/Default/windows/RunnerInstaller.nsi @@ -0,0 +1,213 @@ +; RunnerInstaller.nsi +; +; This script is based on example1.nsi, but it remember the directory, +; has uninstall support and (optionally) installs start menu shortcuts. +; +; It will install example2.nsi into a directory that the user selects, + +;-------------------------------- +!include MUI2.nsh + +!ifndef FULL_VERSION +!define FULL_VERSION "1.0.0.0" +!endif +!ifndef SOURCE_DIR +!define SOURCE_DIR "C:\source\temp\InstallerTest\runner" +!endif +!ifndef INSTALLER_FILENAME +!define INSTALLER_FILENAME "C:\source\temp\InstallerTest\RunnerInstaller.exe" +!endif + +!ifndef MAKENSIS +!define MAKENSIS "%appdata%\GameMaker-Studio\makensis" +!endif + +!ifndef COMPANY_NAME +!define COMPANY_NAME "" +!endif + +!ifndef COPYRIGHT_TXT +!define COPYRIGHT_TXT "(c)Copyright 2013" +!endif + +!ifndef FILE_DESC +!define FILE_DESC "Created with GameMaker:Studio" +!endif + +!ifndef LICENSE_NAME +!define LICENSE_NAME "License.txt" +!endif + +!ifndef ICON_FILE +!define ICON_FILE "icon.ico" +!endif + +!ifndef IMAGE_FINISHED +!define IMAGE_FINISHED "Runner_finish.bmp" +!endif + +!ifndef IMAGE_HEADER +!define IMAGE_HEADER "Runner_header.bmp" +!endif + +!ifndef PRODUCT_NAME +!define PRODUCT_NAME "Runner" +!endif + +!define APP_NAME "${PRODUCT_NAME}" +!define SHORT_NAME "${PRODUCT_NAME}" + +!ifndef EXE_NAME +!define EXE_NAME "${PRODUCT_NAME}" +!endif + + +;;USAGE: +!define MIN_FRA_MAJOR "2" +!define MIN_FRA_MINOR "0" +!define MIN_FRA_BUILD "*" + +!addplugindir "." + +;-------------------------------- + +; The name of the installer +Name "${APP_NAME}" +Caption "${APP_NAME}" +BrandingText "${APP_NAME}" + +; The file to write +OutFile "${INSTALLER_FILENAME}" + +; The default installation directory +InstallDir "$PROFILE\${APP_NAME}" + +; Registry key to check for directory (so if you install again, it will +; overwrite the old one automatically) +InstallDirRegKey HKCU "Software\Runner" "Install_Dir" + +; Request application privileges for Windows Vista +RequestExecutionLevel admin + + +VIProductVersion "${FULL_VERSION}" +VIAddVersionKey /LANG=1033 "FileVersion" "${FULL_VERSION}" +VIAddVersionKey /LANG=1033 "ProductVersion" "${FULL_VERSION}" +VIAddVersionKey /LANG=1033 "ProductName" "${PRODUCT_NAME}" +VIAddVersionKey /LANG=1033 "CompanyName" "${PRODUCT_PUBLISHER}" +VIAddVersionKey /LANG=1033 "LegalCopyright" "${COPYRIGHT_TXT}" +VIAddVersionKey /LANG=1033 "FileDescription" "${FILE_DESC}" + + + +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH +!define MUI_ICON "${ICON_FILE}" +!define MUI_WELCOMEFINISHPAGE_BITMAP "${IMAGE_FINISHED}" +!define MUI_HEADERIMAGE_BITMAP "${IMAGE_HEADER}" +!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH + + +;-------------------------------- + +; Pages +!insertmacro MUI_PAGE_LICENSE "${LICENSE_NAME}" +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES + # These indented statements modify settings for MUI_PAGE_FINISH + !define MUI_FINISHPAGE_NOAUTOCLOSE + !define MUI_FINISHPAGE_RUN_TEXT "Start ${PRODUCT_NAME}" + !define MUI_FINISHPAGE_RUN "$INSTDIR\${EXE_NAME}.exe" +!insertmacro MUI_PAGE_FINISH + +Var DirectXSetupError + +UninstPage uninstConfirm +UninstPage instfiles + +!insertmacro MUI_LANGUAGE "English" +;-------------------------------- + +; The stuff to install +Section `${APP_NAME}` + SectionIn RO + + ; Set output path to the installation directory. + SetOutPath $INSTDIR + + ; Put file there + File "${LICENSE_NAME}" + File /r "${SOURCE_DIR}\*.*" + + ; Write the uninstall keys for Windows + WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SHORT_NAME}" "DisplayName" "${APP_NAME}" + WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SHORT_NAME}" "UninstallString" '"$INSTDIR\uninstall.exe"' + WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SHORT_NAME}" "NoModify" 1 + WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SHORT_NAME}" "NoRepair" 1 + WriteUninstaller "uninstall.exe" + +SectionEnd + +; Optional section (can be disabled by the user) +Section "Start Menu Shortcuts" + + CreateDirectory "$SMPROGRAMS\${APP_NAME}" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${EXE_NAME}.exe" "" "$INSTDIR\${EXE_NAME}.exe" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME} License.lnk" "notepad.exe" "$INSTDIR\License.txt" + +SectionEnd + + +; Optional section (can be enabled by the user) +Section /o "Desktop shortcut" + + CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${EXE_NAME}.exe" "" + +SectionEnd + + +;-------------------------------- + +; Uninstaller + +Section "Uninstall" + ; Remove registry keys + DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SHORT_NAME}" + + ; Remove files and uninstaller (everything) + RMDir /r "$INSTDIR" + + ; Remove desktop icon + Delete "$DESKTOP\${APP_NAME}.lnk" + + ; Remove shortcuts, if any + Delete "$SMPROGRAMS\${APP_NAME}\*.*" + + ; Remove directories used + RMDir "$SMPROGRAMS\${APP_NAME}" + RMDir "$INSTDIR" + +SectionEnd + + +;-------------------------------- +; +; This should be the LAST section available.... +; +Section "DirectX Install" SEC_DIRECTX + + SectionIn RO + + SetOutPath "$TEMP" + File "${MAKENSIS}\dxwebsetup.exe" + DetailPrint "Running DirectX Setup..." + ExecWait '"$TEMP\dxwebsetup.exe" /Q' $DirectXSetupError + DetailPrint "Finished DirectX Setup" + + Delete "$TEMP\dxwebsetup.exe" + + SetOutPath "$INSTDIR" + +SectionEnd diff --git a/source.gmx/Configs/Default/windows/Runner_Icon_256.ico b/source.gmx/Configs/Default/windows/Runner_Icon_256.ico new file mode 100644 index 0000000..655f1c1 Binary files /dev/null and b/source.gmx/Configs/Default/windows/Runner_Icon_256.ico differ diff --git a/source.gmx/Configs/Default/windows/Runner_finish.bmp b/source.gmx/Configs/Default/windows/Runner_finish.bmp new file mode 100644 index 0000000..01b4a2c Binary files /dev/null and b/source.gmx/Configs/Default/windows/Runner_finish.bmp differ diff --git a/source.gmx/Configs/Default/windows/Runner_header.bmp b/source.gmx/Configs/Default/windows/Runner_header.bmp new file mode 100644 index 0000000..db9ea12 Binary files /dev/null and b/source.gmx/Configs/Default/windows/Runner_header.bmp differ diff --git a/source.gmx/Configs/Default/windows/runner_icon.ico b/source.gmx/Configs/Default/windows/runner_icon.ico new file mode 100644 index 0000000..f6c1b44 Binary files /dev/null and b/source.gmx/Configs/Default/windows/runner_icon.ico differ diff --git a/source.gmx/Configs/Default/windows/splash.png b/source.gmx/Configs/Default/windows/splash.png new file mode 100644 index 0000000..d89882f Binary files /dev/null and b/source.gmx/Configs/Default/windows/splash.png differ diff --git a/source.gmx/extensions/N String Parser 2.extension.gmx b/source.gmx/extensions/N String Parser 2.extension.gmx new file mode 100644 index 0000000..59a7f10 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2.extension.gmx @@ -0,0 +1,100 @@ + + + N String Parser 2 + 2.6.6 + com.surgeonassets.nsp2 + + 20/06/18 + Free to use, also for commercial games. + + + + + + + + + + + + + + + + + + + + 743440586 + + + + + Scripts\N String Parser v2_6_6\NSP_Documentation + Scripts\N String Parser v2_6_6\NSP_initialize + Scripts\N String Parser v2_6_6\NSP_free + Scripts\N String Parser v2_6_6\NSP_execute_string + Scripts\N String Parser v2_6_6\NSP_evaluate + Scripts\N String Parser v2_6_6\NSP_notify + Scripts\N String Parser v2_6_6\NSP_save + Scripts\N String Parser v2_6_6\NSP_check_saved + Scripts\N String Parser v2_6_6\NSP_execute_saved + Scripts\N String Parser v2_6_6\NSP_evaluate_saved + Scripts\N String Parser v2_6_6\NSP_free_saved + Scripts\N String Parser v2_6_6\Main\nsp_execute_master + Scripts\N String Parser v2_6_6\Main\nsp_execute_block + Scripts\N String Parser v2_6_6\Main\nsp_execute_line + Scripts\N String Parser v2_6_6\Main\nsp_execute_single + Scripts\N String Parser v2_6_6\Main\nsp_execute_script + Scripts\N String Parser v2_6_6\Utility\List Conversion\nsp_convert_to_list + Scripts\N String Parser v2_6_6\Utility\List Conversion\nsp_tokenize + Scripts\N String Parser v2_6_6\Utility\List Conversion\nsp_get_token_type + Scripts\N String Parser v2_6_6\Utility\List Conversion\nsp_list_set_types + Scripts\N String Parser v2_6_6\Utility\List Conversion\nsp_list_tidy_and_verify + Scripts\N String Parser v2_6_6\Utility\nsp_get_constant + Scripts\N String Parser v2_6_6\Utility\nsp_statement_positions + Scripts\N String Parser v2_6_6\Utility\nsp_list_remove + Scripts\N String Parser v2_6_6\Utility\nsp_build_grid + Scripts\N String Parser v2_6_6\Utility\nsp_grid_shift + Scripts\N String Parser v2_6_6\Utility\nsp_list_to_string + Scripts\N String Parser v2_6_6\Utility\nsp_type_is_a_value + Scripts\N String Parser v2_6_6\Utility\nsp_type_name + Scripts\N String Parser v2_6_6\Evaluator\nsp_evaluate_list + Scripts\N String Parser v2_6_6\Evaluator\nsp_evaluate_single + Scripts\N String Parser v2_6_6\Evaluator\nsp_evaluate_long + Scripts\N String Parser v2_6_6\Evaluator\nsp_evaluate_special_word + Scripts\N String Parser v2_6_6\Setters and Getters\nsp_variable_set_br + Scripts\N String Parser v2_6_6\Setters and Getters\nsp_variable_get_br + Scripts\N String Parser v2_6_6\Setters and Getters\nsp_variable_global_set_br + Scripts\N String Parser v2_6_6\Setters and Getters\nsp_variable_global_get_br + Scripts\N String Parser v2_6_6\Setters and Getters\New\nsp_variable_set_new + Scripts\N String Parser v2_6_6\Setters and Getters\New\nsp_variable_get_new + Scripts\N String Parser v2_6_6\Setters and Getters\New\nsp_variable_global_set_new + Scripts\N String Parser v2_6_6\Setters and Getters\New\nsp_variable_global_get_new + Scripts\N String Parser v2_6_6\Setters and Getters\Legacy\nsp_variable_set + Scripts\N String Parser v2_6_6\Setters and Getters\Legacy\nsp_variable_get + Scripts\N String Parser v2_6_6\Setters and Getters\Legacy\nsp_variable_global_set + Scripts\N String Parser v2_6_6\Setters and Getters\Legacy\nsp_variable_global_get + Scripts\N String Parser v2_6_6\Setters and Getters\DSM\nsp_dsm_set + Scripts\N String Parser v2_6_6\Setters and Getters\DSM\nsp_dsm_get + Scripts\N String Parser v2_6_6\Identifier\nsp_is_special_word + Scripts\N String Parser v2_6_6\Identifier\nsp_is_string + Scripts\N String Parser v2_6_6\Identifier\nsp_is_number + Scripts\N String Parser v2_6_6\Identifier\nsp_is_script + Scripts\N String Parser v2_6_6\Identifier\nsp_is_asset + Scripts\N String Parser v2_6_6\Identifier\nsp_is_variable + Scripts\N String Parser v2_6_6\Identifier\nsp_is_dsm + Scripts\N String Parser v2_6_6\Identifier\Misc\nsp_gm_nom + Scripts\N String Parser v2_6_6\Identifier\Misc\nsp_src_token + Scripts\N String Parser v2_6_6\Identifier\Misc\nsp_token_is_valid + Scripts\N String Parser v2_6_6\Calculator\nsp_arithmetic_calculate + Scripts\N String Parser v2_6_6\Calculator\nsp_comparison_calculate + Scripts\N String Parser v2_6_6\Calculator\nsp_combination_calculate + Scripts\N String Parser v2_6_6\Calculator\nsp_is_equal + Scripts\N String Parser v2_6_6\String Format\nsp_string_crop + Scripts\N String Parser v2_6_6\String Format\nsp_string_crop_ext + Scripts\N String Parser v2_6_6\String Format\nsp_string_find_last + Scripts\N String Parser v2_6_6\String Format\nsp_string_force + + + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_Documentation.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_Documentation.gml new file mode 100644 index 0000000..65c95c5 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_Documentation.gml @@ -0,0 +1,190 @@ +/* N STRING PARSER - DOCUMENTATION: + v2.6.6 + +By Surgeon_. You can send me a PM on GMC if you have any questions, bug reports and/or suggestions. +Credit would be nice if you use it. + +>>BASIC GUIDELINES: + -Initializing: To initialize the parser, call script NSP_initialize. You can change that script to use + whatever tokens/operators suit you, but follow the instructions given there to avoid errors. + + -Freeing: To free the memory used by the parser, call script NSP_free. Regarding its argument, read section + "Saving". + + -Executing: To execute a string, call NSP_execute_string(). Note that you can use the "return" statement + within the code that's executed to return a value. If you do, execution will stop there + (which is expected behavior with "return" calls within scripts). As NSP can only work with + numbers and strings, the returned values can only be numbers and strings. Attempting to + return, for example, an array pointer will result in undefined behavior. If no return calls + get triggered in the string being executed, NSP_execute_string() will return undefined. + + -Evaluating: To evaluate a string (an expression or an equation in the form of a string, such as 5+6 + or (my_number(x+y) / (20 mod 14)), or whatever, call script NSP_evaluate. Note that when + using variables like x, y, or any other, NSP will access those of the calling instance. + + -Notifying: In the case of a syntax error, NSP will not crash your game, it will only abort execution + (or evaluation) and call NSP_notify to let you know what went wrong (well, that's at least + what should happen). You can change that script to inform the user about an error in another + way, or not inform them at all. Because there are usually multiple NSP_notify calls when an + error occurs, you should use some method which does not stop the Runner. When using NSP_evaluate, + in the case of an error, that function will return the abort string (also defined in script + NSP_initialize, by default it's NSP__ABORT). Note that trying to access uninitialized variables + will crash your game anyway, and there's no way to prevent that. However, it would be good to + report any other situation where NSP crashed your program to see if it can be fixed. + + -Saving: When you want to execute or evaluate the same string multiple times, it is faster to pre-parse + the string (using the NSP_save(...) function) and then use NSP_execute_saved(...) and + NSP_evaluate_saved(...). You can also use NSP_check_saved(...) to see if pre-parsing was successful. + If it returns 0, that means that NSP discovered that the string was not valid input and therefor + it cannot be executed nor evaluated. If it returns 1, it means that no fault was detected in the + input, but be careful - it may still throw an error once executed / evaluated! + + Example: + + a=NSP_save("x=player_get_x();"); + if (NSP_check_saved(a)) + NSP_execute_saved(a); + + IMPORTANT: When you use NSP_save(...) function you get the information in the form of a ds_list and + you should treat it as a ds_list - destroy it when you no longer need it! (For example: + NSP_free_saved(a); ) Note that calling NSP_free() will only destroy these lists if you provide "true" + as its argument. + + -Underlying scripts: Scripts that have names starting with "nsp_" rather than "NSP_" are underlying and + should not be changed (except for nsp_variable_* scripts and nsp_execute_script), + and also should not be used individually (except for nsp_string_* functions, which you + can use to format strings, if you understand what they do). + + -Semicolons: Make sure to end each part of your code with semicolons ( ; )! This is very important! For + example, executing "x+=8; y+=8;" will work, but executing "x+=8 y+=8;" will not! In some + instances semicolons may not be needed (for example at the very end of the string to execute), + but better to be safe than sorry. + + -Blocks of code: You can use { and } to make blocks of code to be executed as a single thing after a, for + example, if statement. You can also use begin / end instead of { / } if you so prefer. + + -Executing scripts: NSP can execute all custom scripts (using asset_get_index), and built-in ones that + you define, however, it cannot execute scripts with more than 15 arguments. Also, if a + script returns a value which is not a string or a real, NSP can't interpret it. + + -Using asset names: You can use asset names in scripts (for example, instance_create(x,y,obj_player) will + work if obj_player exists). + + --------------------------------------------------------------------------------------------------------------- + +>>SUPPORTED OPERATORS: + -Comparison: + -Equal, Not equal, Greater than, Greater than or equal, Lower than, Lower than or equal + -Logical (not bitwise!): + -And, Or, Xor + -Bitwise: + /none/ + -Aritmetic: + -Addition, Subtraction, Multiplication, Division, Integer division (div), Modulo (mod), Power (x^y) + -Unary negation (-a) and an analogous unary + (+a) + -Other: + -Parenthesis for calling functions and overriding operation priorities + +>>SUPPORTED BUILT-IN SCRIPTS: + + Note: By "built-in scripts" I mean "built in *functions*". + + - show_message(), + - sqrt(), + - sqr(). + + *How to add more: Because asset_get_index does not work on built-in scripts, these have to be added + manually. Find the nsp_execute_script(...) script (in the Main parser section). + Follow the already established pattern to add more scripts to use (though you can + also remove them to prevent them from being used). + +>>SUPPORTED VARIABLES: + - x, y. + + *How to add more: Because GM:S has no way of accessing variables dynamically, this part has to be + done manually. You need to find two scripts, nsp_variable_set and nsp_variable_get + (in the Variable parser section). In both of them, find the large "switch" construction + and follow the already established format to add more variables to use (though you + can also remove them to prevent them from being used). + + IMPORTANT: As of version 2.5.6, NSP can use variable_instance_* functions to access ANY local variables + dynamically. This also means that you can't prevent the end user from changing or adding any variable they want! + This behaviour is now active by default, but if you still want to use the old system with large switch + statements, find the enumerator NSP_VAR_SYS in script NSP_initialize() and set NSP_VAR_SYS.new = 0. + +>>SUPPORTED GLOBAL VARIABLES: + - room_speed, state. + + -NOTE: NSP reckognizes a global variable because of its "global." prefix. Because of that, to read + or write built-in global scope variables such as "score", you need to write "global.score", + although ultimately the effect will be the same. + + *How to add more: Same situation as with local variables. This time you need to find nsp_variable_global_set + and nsp_variable_global_get (in the Variable parser section) and follow the already + established patern to add more global variables to use (though you can also remove them + to prevent them from being used). + + IMPORTANT: As of version 2.5.6, NSP can use variable_global_* functions to access ANY global variables + dynamically (though they still need a "global." prefix even if they are built-in). This also means that + you can't prevent the end user from changing or adding any variable they want! This behaviour is now + active by default, but if you still want to use the old system with large switch statements, find the + enumerator NSP_VAR_SYS in script NSP_initialize() and set NSP_VAR_SYS.new = 0. + +>>SUPPORTED CONSTANTS: + - mb_left, mb_right, mb_middle, vk_left, vk_right, vk_up, vk_down, vk_enter. + + *How to add more: Because GM:S has no way of accessing constants dynamically, this part has to be + done manually. You need to find a script named nsp_get_constant in the Utility section. + Open it and find the large "switch" construction and follow the already established + format to add more constants to use (though you can also remove them to prevent them + from being used). These do not neccesarily have to be built-in constants, you can also + use user-defined ones. + +>>SUPPORTED KEYWORDS: + - self, + - other. + +>>SUPPORTED STATEMENTS: + - With, + - Repeat, + - If/Else, + - While, + - Return. + + -NOTE: All of these, except for Return, must be in the following format: + [Statement] ([Counter/Condition]) [Code to execute]; <-- Semicolon is VERY important here! + Alternatively, they can be in this format: + [Statement] ([Counter/Condition]) { [Code to execute]; }; <-- This semicolon is optional. + (If statement can have an else statement and more code after the semicolon.) + + -NOTE: Return statement must be in the following format: + [Statement] [Expression]; + + +>>DSM FUNCTIONALITY: + -NSP has a quick access functionality for a single global ds_map (use nspDsMsp to reference it if you + need to). In the nsp_initialize script you'll need to enable DSM and set a reference word for it (by + default it's "NSP_DSM"). Later, when executing code using NSP you can write NSP_DSM.a=5, + (or instead NSP_DSM whatever name you defined), and it will assign 5 to the key "a" in that ds_map. + Later, when you need to retreive that value, just use NSP_DSM.a again. You can also use NSP_DSM+=a, + NSP_DSM*=a etc. DSM is useful because ds_map keys can be strings and so can be accessed dynamically + (in other words, when using DSM you can use any variable name, not just those defined in nsp_variable_* + functions). + + IMPORTANT: The DSM reference word will hide any variables with the same name, so be careful. + + --------------------------------------------------------------------------------------------------------------- + +>>EXAMPLES: + (These are a few examples of what NSP can execute or evaluate.) + + - x=my_number(x+y) / ( (20 mod 14) * ('a'=='a') / (3 +- (6+4==7)) ) +16; + - instance_create(x,y,obj_tester).vspeed=2; + - with (other) {instance_destroy()}; + - with (instance_create(32,32,obj_tester)) hspeed=1; + - "my_number(1+my_number( ... +my_number(1))))))))))))))))))))))))))))))"; + + + + + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_check_saved.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_check_saved.gml new file mode 100644 index 0000000..87209c7 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_check_saved.gml @@ -0,0 +1,10 @@ +///NSP_check_saved(List ID) +/* + +Checks whether a saved (converted) string passed validation. + +Returns: 1 if the string is valid; 0 otherwise + +*/ + +return (argument0[|2] != 0); diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_evaluate.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_evaluate.gml new file mode 100644 index 0000000..fe92c98 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_evaluate.gml @@ -0,0 +1,40 @@ +///NSP_evaluate(String) +/* + +Evaluates a string of GML code. + +Returns: Result of evaluation or the abort string. + +*/ +var nspListStr, nspListPar, + nspToken = global.nspToken; +var rv, succ; + +if (argument0 == "") return ""; + +nspListStr = ds_list_create(); +nspListPar = ds_list_create(); + +succ = nsp_convert_to_list(argument0, nspListStr, nspListPar); + +if (!succ) { + + NSP_notify("SCRIPT: NSP_evaluate. ERROR: String will not be evaluated because it could not be converted."); + + ds_list_destroy(nspListStr); + ds_list_destroy(nspListPar); + + return nspToken[NSP_TOK.abort]; + + } + +rv = nsp_evaluate_list(0, ds_list_size(nspListStr)-1, nspListStr, nspListPar); + +//SQ: +if is_string(rv) and nsp_is_string(rv) + rv=string_copy(rv,2,string_length(rv)-2); + +ds_list_destroy(nspListStr); +ds_list_destroy(nspListPar); + +return rv; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_evaluate_saved.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_evaluate_saved.gml new file mode 100644 index 0000000..7078114 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_evaluate_saved.gml @@ -0,0 +1,36 @@ +///NSP_evaluate_saved(List ID) +/* + +Evaluates a saved (converted) string. + +Returns: Result of evaluation or the abort string. + +*/ +var nspListStr = ds_list_create(), + nspListPar = ds_list_create(); + nspToken = global.nspToken; +var rv; + +if (argument0[|2] == 0) { + + ds_list_destroy(nspListStr); + ds_list_destroy(nspListPar); + + NSP_notify("SCRIPT: NSP_evaluate_saved. ERROR: Input did not pass validation."); + return nspToken[NSP_TOK.abort]; + + } + +ds_list_copy(nspListStr, argument0[|0]); +ds_list_copy(nspListPar, argument0[|1]); + +rv = nsp_evaluate_list(0, ds_list_size(nspListStr)-1, nspListStr, nspListPar); + +//SQ: +if (is_string(rv) and nsp_is_string(rv)) + rv = string_copy(rv, 2, string_length(rv)-2); + +ds_list_destroy(nspListStr); +ds_list_destroy(nspListPar); + +return rv; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_execute_saved.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_execute_saved.gml new file mode 100644 index 0000000..764cae5 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_execute_saved.gml @@ -0,0 +1,32 @@ +///NSP_execute_saved(List ID) +/* + +Executes a saved (converted) string. + +Returns: Argument of "return" statement or undefined + (see the documentation). + +*/ +var nspListStr = ds_list_create(), + nspListPar = ds_list_create(), + rv; + +if (argument0[|2] == 0) { + + ds_list_destroy(nspListStr); + ds_list_destroy(nspListPar); + + NSP_notify("SCRIPT: NSP_execute_saved. ERROR: Input did not pass validation."); + return undefined; + + } + +ds_list_copy(nspListStr, argument0[|0]); +ds_list_copy(nspListPar, argument0[|1]); + +rv = nsp_execute_master(0, ds_list_size(nspListStr)-1, false, nspListStr, nspListPar); + +ds_list_destroy(nspListStr); +ds_list_destroy(nspListPar); + +return rv; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_execute_string.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_execute_string.gml new file mode 100644 index 0000000..5f8f571 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_execute_string.gml @@ -0,0 +1,39 @@ +///NSP_execute_string(String) +/* + +Executes a string of GML code. + +Returns: Argument of "return" statement or undefined + (see the documentation). + +*/ +var nspListStr, nspListPar, rv, succ; + +if (argument0 == "") return undefined; + +nspListStr = ds_list_create(); +nspListPar = ds_list_create(); + +succ = nsp_convert_to_list(argument0, nspListStr, nspListPar); + +if (!succ) { + + NSP_notify("SCRIPT: NSP_execute_string. ERROR: String will not be executed because it could not be converted."); + + ds_list_destroy(nspListStr); + ds_list_destroy(nspListPar); + + return undefined; + + } + +rv = nsp_execute_master(0, ds_list_size(nspListStr)-1, false, nspListStr, nspListPar); + +ds_list_destroy(nspListStr); +ds_list_destroy(nspListPar); + + //DEBUG: + //show_message("NSP_execute_string returned:"); + //show_message(rv); + +return rv; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_free.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_free.gml new file mode 100644 index 0000000..f75ffea --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_free.gml @@ -0,0 +1,31 @@ +///NSP_free(Free Saved); +/* + +Frees all the memory used by the parser. +If argument0 is set to true then all data saved by using +NSP_save(...) function will be freed as well. + +Returns: n/a + +*/ +var; + +global.nspToken=0; + +//ds_list_destroy(global.nspListStr); +//ds_list_destroy(global.nspListPar); + +if (global.nspDsMap<>-1 and ds_exists(global.nspDsMap,ds_type_map)) + ds_map_destroy(global.nspDsMap); + +if argument0==true { + + repeat (ds_list_size(global.nspListSaved)) begin + + NSP_free_saved(global.nspListSaved[|0]); + + end; + + } + +ds_list_destroy(global.nspListSaved); diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_free_saved.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_free_saved.gml new file mode 100644 index 0000000..3c73cd2 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_free_saved.gml @@ -0,0 +1,16 @@ +///NSP_free_saved(List ID) +/* + +Frees the memory used by a saved (converted) string. + +Returns: n/a + +*/ +var index; + +ds_list_destroy(argument0[|0]); +ds_list_destroy(argument0[|1]); +ds_list_destroy(argument0); + +index=ds_list_find_index(global.nspListSaved,argument0); +ds_list_delete(global.nspListSaved,index); diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_initialize.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_initialize.gml new file mode 100644 index 0000000..f6ffbcf --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_initialize.gml @@ -0,0 +1,116 @@ +///NSP_initialize() +/* + +Initializes the parser (for more info read NSP Documentation). + +Data that will be used: + + NSP_TOK (enum) + NSP_TYPE (enum) + global.nspToken (1d array) + global.nspListSaved (ds_list) + global.nspDsMap (ds_map) + + Obsolete: + global.nspListStr (ds_list) + global.nspListPar (ds_list) + +Returns: n/a + +*/ + +//*** Nomenclature: (Do not change this enumerator) +enum NSP_TOK { + //Comparing: + equal, unequal, + larger, larger_equal, + smaller, smaller_equal, + //Combining: + _and, _or, _xor, + //Math: + add, subtract, + multiply, divide, + _div, _mod, + _power, + //Other: + abort, quote, assign, dsm_name, dsm_allowed + }; + +/*LOCKED CHARACTERS: (These characters cannot be used as tokens, however, note that the minus ("-") can +still be used as the operator for subtraction, but ONLY for subtraction.) +( ) { } - ; . , + +*/ + +// Tokens can be letters-only or contain no letters at all, +// and 1 to 3 characters in length. + +//COMBINING: +global.nspToken[NSP_TOK._and] = "and"; +global.nspToken[NSP_TOK._or] = "or"; +global.nspToken[NSP_TOK._xor] = "xor"; + +//COMPARING: +global.nspToken[NSP_TOK.equal] = "=="; +global.nspToken[NSP_TOK.larger] = ">"; +global.nspToken[NSP_TOK.larger_equal] = ">="; +global.nspToken[NSP_TOK.smaller] = "<"; +global.nspToken[NSP_TOK.smaller_equal] = "<="; +global.nspToken[NSP_TOK.unequal] = "<>"; + +//MATH: +global.nspToken[NSP_TOK.add] = "+"; +global.nspToken[NSP_TOK.subtract] = "-"; +global.nspToken[NSP_TOK.multiply] = "*"; +global.nspToken[NSP_TOK.divide] = "/"; +global.nspToken[NSP_TOK._div] = "div"; +global.nspToken[NSP_TOK._mod] = "mod"; +global.nspToken[NSP_TOK._power] = "^"; + +//BITWISE: +//Currently not supported. + +//OTHER: +global.nspToken[NSP_TOK.assign] = "="; // Assignment operator. NOTE: In code, you can put your + // defined operator for adding, subtracting, dividing or + // multiplying before the assignment operator to do + // things like x+=32; +global.nspToken[NSP_TOK.abort] = "_NSP_ABORT_"; // String to return upon failure. +global.nspToken[NSP_TOK.quote] = "'"; // For beginnigs and ends of strings (within strings). + // Must be a single character! + +//DSM: +global.nspToken[NSP_TOK.dsm_allowed] = 1; // Whether DSM is allowed: 1 = Yes, 0 = No. +global.nspToken[NSP_TOK.dsm_name] = "NSP_DSM";// Only relevant if DSM is allowed. + +//VARIABLE SYSTEM: +enum NSP_VAR_SYS { + + new = 1 // If you want to use the new variable system (using the new variable_* functions) set new = 1. + // Otherwise set new = 0 to use the old system (not recommended). + } + +//*** Other: (Do not change this part) +//global.nspListStr = ds_list_create(); +//global.nspListPar = ds_list_create(); +global.nspListSaved = ds_list_create(); + +if (global.nspToken[NSP_TOK.dsm_allowed] == 1) + global.nspDsMap = ds_map_create(); +else + global.nspDsMap = -1; + +//*** Data types: (Do not change this enumerator) +enum NSP_TYPE { + _symbol, //0 + _operator, + _number, + _string, + _script, //4 + _asset, + _variablesl, + _variablecl, + _variablegl, //8 + _dsm, + _specword + } diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_notify.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_notify.gml new file mode 100644 index 0000000..82e613e --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_notify.gml @@ -0,0 +1,22 @@ +///NSP_notify(Message, [OPT] List, Start, End) +/* + +Notifies the user about an error that has occured. You can change this script +(read NSP Documentation for more info). + +Returns: n/a + +*/ +var; + +//*** Do not change this part ***// +if (argument_count > 1) { + + argument[0] += " FAULTY CODE: " + nsp_list_to_string(argument[1], argument[2], argument[3], "^"); + + } + +// You can use argument[0] (string) from now on to report an error in any way. +// Default implementation: show_error(argument[0], false); + +show_error(argument[0], false); diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_save.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_save.gml new file mode 100644 index 0000000..9283142 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/NSP_save.gml @@ -0,0 +1,24 @@ +///NSP_save(String) +/* + +Converts a string into a ds_list, so that it can be executed / evaluated +later and multiple times faster than usual. + +Returns: ID of the ds_list containing the data about the converted string. + +*/ +var rv, list_1, list_2, list_3; + +list_1 = ds_list_create(); +list_2 = ds_list_create(); +list_3 = ds_list_create(); + +rv = nsp_convert_to_list(argument0, list_1, list_2); + +list_3[|2] = rv; +list_3[|1] = list_2; +list_3[|0] = list_1; + +ds_list_add(global.nspListSaved, list_3); + +return list_3; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_arithmetic_calculate.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_arithmetic_calculate.gml new file mode 100644 index 0000000..3e93b12 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_arithmetic_calculate.gml @@ -0,0 +1,82 @@ +///nsp_arithmetic_calculate(Value 1, Value 2, Token) +/* +Underlying NSP script. +NOTE: Add error checking for incompatible data types. +*/ +var nspToken=global.nspToken; + +//Add: +if argument2=nspToken[NSP_TOK.add] { + + //DEBUG: + //show_message("Arg0: "+nsp_string_force(argument0)+", isString: "+string(is_string(argument0))); + //show_message("Arg1: "+nsp_string_force(argument1)+", isString: "+string(is_string(argument1))); + + if is_string(argument0) { + if nsp_is_number(argument0) + argument0=real(argument0) + else argument0=string_delete(argument0,string_length(argument0),1); + } + + if is_string(argument1) { + if nsp_is_number(argument1) + argument1=real(argument1) + else argument1=string_delete(argument1,1,1); + } + + //DEBUG: + //show_message("Arg0: "+nsp_string_force(argument0)+", isString: "+string(is_string(argument0))); + //show_message("Arg1: "+nsp_string_force(argument1)+", isString: "+string(is_string(argument1))); + + return nsp_string_force(argument0+argument1); + + } + +//Convert arguments for following functions: +if is_string(argument0) + argument0=real(argument0); +if is_string(argument1) + argument1=real(argument1); + +//Subtract: +if argument2=nspToken[NSP_TOK.subtract] { + + return string(argument0-argument1); + + } + +//Divide: +if argument2=nspToken[NSP_TOK.divide] { + + return string(argument0/argument1); + + } + +//Multiply: +if argument2=nspToken[NSP_TOK.multiply] { + + return string(argument0*argument1); + + } + +//Modulo: +if argument2=nspToken[NSP_TOK._mod] { + + return string(argument0 mod argument1); + + } + +//Div: +if argument2=nspToken[NSP_TOK._div] { + + return string(argument0 div argument1); + + } + +//Power: +if argument2=nspToken[NSP_TOK._power] { + + return string(power(argument0,argument1)); + + } + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_build_grid.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_build_grid.gml new file mode 100644 index 0000000..bf30b51 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_build_grid.gml @@ -0,0 +1,23 @@ +///nsp_build_grid(Start, End, StrList, ParList) +/* +Underlying NSP script. +*/ +var nspListStr = argument2, + nspListPar = argument3; +var i,d,list_min,list_max,grid; + +list_min=argument0; +list_max=argument1; + +d=(list_max-list_min); + +grid=ds_grid_create(d+1,2); + +for (i=0; i<=d; i+=1) begin + + grid[#i,0]=nspListStr[|list_min+i]; + grid[#i,1]=nspListPar[|list_min+i]; + +end; + +return grid; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_combination_calculate.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_combination_calculate.gml new file mode 100644 index 0000000..70dfafd --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_combination_calculate.gml @@ -0,0 +1,34 @@ +///nsp_combination_calculate(Value 1, Value 2, Token) +/* +NOTE: Add error checking for incompatible data types. +*/ +var nspToken=global.nspToken; + +//Convert arguments for following functions: +if is_string(argument0) + argument0=real(argument0); +if is_string(argument1) + argument1=real(argument1); + +//And: +if argument2=nspToken[NSP_TOK._and] { + + return string( (argument0 and argument1)*1.0 ); + + } + +//Or: +if argument2=nspToken[NSP_TOK._or] { + + return string( (argument0 or argument1)*1.0 ); + + } + +//Xor: +if argument2=nspToken[NSP_TOK._xor] { + + return string( (argument0 xor argument1)*1.0 ); + + } + + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_comparison_calculate.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_comparison_calculate.gml new file mode 100644 index 0000000..d070104 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_comparison_calculate.gml @@ -0,0 +1,56 @@ +///nsp_comparison_calculate(Value 1, Value 2, Token) +/* +Underlying NSP script. +NOTE: Add error checking for incompatible data types. +*/ +var nspToken=global.nspToken; + +//Equal: +if argument2=nspToken[NSP_TOK.equal] { + + return string( (argument0==argument1)*1.0 ); + + } + +//Unequal: +if argument2=nspToken[NSP_TOK.unequal] { + + return string( (argument0<>argument1)*1.0 ); + + } + +//Convert arguments for following functions: +if is_string(argument0) + argument0=real(argument0); +if is_string(argument1) + argument1=real(argument1); + +//Larger: +if argument2=nspToken[NSP_TOK.larger] { + + return string( (argument0>argument1)*1.0 ); + + } + +//Larger or equal: +if argument2=nspToken[NSP_TOK.larger_equal] { + + return string( (argument0>=argument1)*1.0 ); + + } + +//Smaller: +if argument2=nspToken[NSP_TOK.smaller] { + + return string( (argument00 pri_b-=1 + else { + //BREAK + if t>i+2 { + arg[counter]=nsp_evaluate_long(g,true,pos_a,t-1); + if nsp_is_equal(arg[counter],nspToken[NSP_TOK.abort]) { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Script argument evaluation failed."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + counter+=1; + } + + break; + } + } + + } + + if counter>0 + rv=nsp_execute_script(g[#i,0],arg) + else + rv=nsp_execute_script(g[#i,0],0); + + if nsp_is_equal(rv,nspToken[NSP_TOK.abort]) { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Script execution failed."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + //SQ: + if is_string(rv) rv=nspToken[NSP_TOK.quote]+rv+nspToken[NSP_TOK.quote]; + + // Special case - the script was the only thing to evaluate: + if (i == list_min and t == list_max) { + ds_grid_destroy(g); + return rv; + } + // *** + + nsp_grid_shift(g,i+1,t); + + if is_real(rv) + g[#i,1]=NSP_TYPE._number + else if is_string(rv) + g[#i,1]=NSP_TYPE._string + else { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Script returned incompatible value."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + + g[#i,0]=nsp_string_force(rv); + + list_max-=(t-i); + i+=1; + + } + else i+=1; + +end; + + //2.1 Check if it's single now: + if (list_min=list_max) { + rv=nsp_evaluate_single(g[#list_min,0],g[#list_min,1]); + ds_grid_destroy(g); + return rv; + } + +//3. Deal with complex local variables and DSM: ------------------------------------------------------------% +i=list_min+1; +while (i<=list_max) begin + + if g[#i,1]=NSP_TYPE._variablecl { + + var a,t,variable,target,min_pos; + + if g[#i-1,0]=")" { + + pri_b=0; + min_pos=-1; + for (t=i-2; t>=list_min; t-=1) { + if g[#t,0]=")" pri_b+=1 + else if g[#t,0]="(" { + if pri_b=0 { + //BREAK + min_pos=t; + break; + } + else + pri_b-=1; + } + if (t=list_min and min_pos=-1) { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Could not fetch complex local variable."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + } + + if (min_pos>list_min and g[#min_pos-1,1]=NSP_TYPE._script) + min_pos-=1; + + target=nsp_evaluate_long(g,true,min_pos,i-1); + variable=string_replace(g[#i,0],".",""); + + } + else if (g[#i-1,1]=NSP_TYPE._dsm) { + + target=nspToken[NSP_TOK.dsm_name]; + variable=string_replace(g[#i,0],".",""); + min_pos=i-1; + + } + else { + + target=nsp_evaluate_single(g[#i-1,0],g[#i-1,1]); + variable=string_replace(g[#i,0],".",""); + min_pos=i-1; + + } + + if nsp_is_equal(target,nspToken[NSP_TOK.abort]) or nsp_is_equal(variable,nspToken[NSP_TOK.abort]) { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Could not fetch complex local variable."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + + if is_real(target) { + a=nsp_variable_get_br(target,variable); + } + else { + a=nsp_dsm_get(variable); + } + + if nsp_is_equal(a,nspToken[NSP_TOK.abort]) { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Could not fetch complex local variable."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + + nsp_grid_shift(g,min_pos+1,i); + + g[#min_pos,0]=nsp_string_force(a); + + if is_real(a) + g[#min_pos,1]=NSP_TYPE._number + else if is_string(a) + g[#min_pos,1]=NSP_TYPE._string + else { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Incompatible value returned."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + + list_max-=(i-min_pos); + i+=1; + + } + else + i+=1; + +end; + + //3.1 Check if it's single now: + if (list_min=list_max) { + rv=nsp_evaluate_single(g[#list_min,0],g[#list_min,1]); + ds_grid_destroy(g); + return rv; + } + +//4. Deal with nested parenthesis: -------------------------------------------------------------------------% +i=list_max; +while (i>=list_min) begin + + if g[#i,0]="(" { + + var t,a,max_pos; + + max_pos=-1; + for (t=i; t<=list_max; t+=1) { + + if g[#t,0]=")" { + //BREAK + max_pos=t; + break; + } + + if (t=list_max and max_pos=-1) { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Can't find closed parenthesis."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + + } + + a=nsp_evaluate_long(g,true,i+1,t-1); + + if nsp_is_equal(a,nspToken[NSP_TOK.abort]) { + NSP_notify("SCRIPT: nsp_evaluate_long. Nested parenthesis evaluation failed."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + + nsp_grid_shift(g,i+1,t); + + if is_real(a) + g[#i,1]=NSP_TYPE._number + else if is_string(rv) + g[#i,1]=NSP_TYPE._string + else { + NSP_notify("SCRIPT: nsp_evaluate_long. ERROR: Calculations returned incompatible value."); + ds_grid_destroy(g); + return nspToken[NSP_TOK.abort]; + } + + g[#i,0]=nsp_string_force(a); + + list_max-=(t-i); + i-=1; + + } + else + i-=1; + +end; + + //4.1 Check if it's single now: + if (list_min=list_max) { + rv=nsp_evaluate_single(g[#list_min,0],g[#list_min,1]); + ds_grid_destroy(g); + return rv; + } + +//5. Deal with binary operations: --------------------------------------------------------------------------% +var a,token,val_l,val_r; + +//Math (division, div, modulo, multiply, power): +i=list_min; +while (i>list_min = " + string(list_min) + ", list_max = " + string(list_max) + ", i = " + string(i)); + +while (i>list_min = " + string(list_min) + ", list_max = " + string(list_max) + ", i = " + string(i)); + + } + + } + + i+=1; + + } + +//Comparisons (equal, larger, larger_equal, smaller, smaller_equal, unequal): +i=list_min; +while (i=list_min { + rv=nsp_execute_master(list_min, list_max, argument2, nspListStr, nspListPar); + if !is_undefined(rv) return rv; + } + +return undefined; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_execute_script.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_execute_script.gml new file mode 100644 index 0000000..084ff79 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_execute_script.gml @@ -0,0 +1,128 @@ +///nsp_execute_script(Script name, Argument array) +/* +Underlying NSP script. Can be changed by user (read NSP Documentation for more info). +*/ +var nspToken=global.nspToken; +var rv,a; + +//See if any arguments are strings and convert if necessary: +if is_array(argument1) { + + for (i=0; iasset_script { + NSP_notify("SCRIPT: nsp_execute_script. ERROR: Script not supported ( "+argument0+" )."); + return nspToken[NSP_TOK.abort]; + } + break; + +end; + +//PART 2 (Custom scripts): -------------------------------------------------------------------------------------------- + +argument0=asset_get_index(argument0); + +if is_array(argument1) + a=array_length_1d(argument1) + else a=0; + +switch (a) begin + + case 0: + rv=script_execute(argument0); + break; + + case 1: + rv=script_execute(argument0,argument1[0]); + break; + + case 2: + rv=script_execute(argument0,argument1[0],argument1[1]); + break; + + case 3: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2]); + break; + + case 4: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3]); + break; + + case 5: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4]); + break; + + case 6: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5]); + break; + + case 7: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6]); + break; + + case 8: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6],argument1[7]); + break; + + case 9: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6],argument1[7],argument1[8]); + break; + + case 10: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6],argument1[7],argument1[8],argument1[9]); + break; + + case 11: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6],argument1[7],argument1[8],argument1[9],argument1[10]); + break; + + case 12: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6],argument1[7],argument1[8],argument1[9],argument1[10],argument1[11]); + break; + + case 13: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6],argument1[7],argument1[8],argument1[9],argument1[10],argument1[11],argument1[12]); + break; + + case 14: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6],argument1[7],argument1[8],argument1[9],argument1[10],argument1[11],argument1[12],argument1[13]); + break; + + case 15: + rv=script_execute(argument0,argument1[0],argument1[1],argument1[2],argument1[3],argument1[4],argument1[5],argument1[6],argument1[7],argument1[8],argument1[9],argument1[10],argument1[11],argument1[12],argument1[13],argument1[14]); + break; + + default: + NSP_notify("SCRIPT: nsp_execute_script. ERROR: Too many arguments."); + return nspToken[NSP_TOK.abort]; + break; + +end; + +return rv; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_execute_single.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_execute_single.gml new file mode 100644 index 0000000..fe83a68 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_execute_single.gml @@ -0,0 +1,215 @@ +///nsp_execute_single(Start, End, StrList, ParList) +/* +Underlying NSP script. +*/ +var nspListStr = argument2, + nspListPar = argument3, + nspToken=global.nspToken; +var i,av,list_min,list_max,pos,op_char,as_var_max,exec_code_min; + +list_min=argument0; +list_max=argument1; + +if nspListStr[|list_max]=";" + list_max-=1; + +//***Search for assignment token etc: +pos=-1; +for (i=list_min; i<=list_max; i+=1) begin + if nspListStr[|i]=nspToken[NSP_TOK.assign] { + pos=i; + break;} + end; + +if pos<>-1 { + //Operator char: + op_char=nspListStr[|pos-1]; + + if op_char=nspToken[NSP_TOK.add] + op_char="+" + else if op_char=nspToken[NSP_TOK.subtract] + op_char="-" + else if op_char=nspToken[NSP_TOK.multiply] + op_char="*" + else if op_char=nspToken[NSP_TOK.divide] + op_char="/" + else + op_char=""; + + //Assign Variable: + if op_char="" + as_var_max=pos-1 + else + as_var_max=pos-2; + + //Code to execute: + exec_code_min=pos+1; + + } + else { + op_char=""; + as_var_max=-1; + exec_code_min=list_min; + } + +//***Evaluate code: +av=nsp_evaluate_list(exec_code_min, list_max, nspListStr, nspListPar); +if nsp_is_equal(av,nspToken[NSP_TOK.abort]) { + NSP_notify("SCRIPT: nsp_execute_single. ERROR: Aborting because evaluation failed.",nspListStr,list_min,list_max); + return nspToken[NSP_TOK.abort]; + } + +//***Assign value: +if as_var_max<>-1 { + + var mode,varname,target; + + switch (nspListPar[|as_var_max]) begin + + case NSP_TYPE._variablesl: + varname=nspListStr[|as_var_max]; + target=id; + mode=0; + break; + + case NSP_TYPE._variablecl: + varname=string_replace(nspListStr[|as_var_max],".",""); + + //Check if it's DSM: + if (list_min=as_var_max-1 and nspListStr[|list_min]=nspToken[NSP_TOK.dsm_name]) { + mode=3; + } + else { + target=nsp_evaluate_list(list_min, as_var_max-1, nspListStr, nspListPar); + + if nsp_is_equal(target,nspToken[NSP_TOK.abort]) { + NSP_notify("SCRIPT: nsp_execute_single. ERROR: Cannot assign value because target could not be evaluated.",nspListStr,list_min,list_max); + exit; + } + + mode=1; + } + break; + + case NSP_TYPE._variablegl: + varname=nspListStr[|as_var_max]; + target=-1; + mode=2; + break; + + default: + NSP_notify("SCRIPT: nsp_execute_single. ERROR: Cannot assign value - illegal target.",nspListStr,list_min,list_max); + exit; + break; + + end; + + //Find current value if needed: + if op_char<>"" { + + var old_val; + + if mode<=1 { + + old_val=nsp_variable_get_br(target,varname); + if nsp_is_equal(old_val,nspToken[NSP_TOK.abort]) { + exit; + } + //SQ + if is_string(old_val) old_val=nspToken[NSP_TOK.quote]+old_val+nspToken[NSP_TOK.quote]; + + } + else if mode=2 { + + old_val=nsp_variable_global_get_br(varname); + if nsp_is_equal(old_val,nspToken[NSP_TOK.abort]) { + exit; + } + //SQ + if is_string(old_val) old_val=nspToken[NSP_TOK.quote]+old_val+nspToken[NSP_TOK.quote]; + + } + else if mode=3 { + + old_val=nsp_dsm_get(varname); + if nsp_is_equal(old_val,nspToken[NSP_TOK.abort]) { + exit; + } + //SQ + if is_string(old_val) old_val=nspToken[NSP_TOK.quote]+old_val+nspToken[NSP_TOK.quote]; + + } + } + + //Switch using operator char (calcualted above): + switch (op_char) begin + + case "+": + + if is_real(old_val) + av=real(nsp_arithmetic_calculate(old_val,av,nspToken[NSP_TOK.add])) + else av=nsp_arithmetic_calculate(old_val,av,nspToken[NSP_TOK.add]); + + if mode<=1 { + nsp_variable_set_br(target,varname,av); + } + else if mode=2 { + nsp_variable_global_set_br(varname,av); + } + else if mode=3 { + nsp_dsm_set(varname,av); + } + + break; + + case "-": + if mode<=1 { + nsp_variable_set_br(target,varname,old_val-av); + } + else if mode=2 { + nsp_variable_global_set_br(varname,old_val-av); + } + else if mode=3 { + nsp_dsm_set(varname,old_val-av); + } + break; + + case "*": + if mode<=1 { + nsp_variable_set_br(target,varname,old_val*av); + } + else if mode=2 { + nsp_variable_global_set_br(varname,old_val*av); + } + else if mode=3 { + nsp_dsm_set(varname,old_val*av); + } + break; + + case "/": + if mode<=1 { + nsp_variable_set_br(target,varname,old_val/av); + } + else if mode=2 { + nsp_variable_global_set_br(varname,old_val/av); + } + else if mode=3 { + nsp_dsm_set(varname,old_val/av); + } + break; + + default: + if mode<=1 { + nsp_variable_set_br(target,varname,av); + } + else if mode=2 { + nsp_variable_global_set_br(varname,av); + } + else if mode=3 { + nsp_dsm_set(varname,av); + } + break; + + end; + + } diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_get_constant.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_get_constant.gml new file mode 100644 index 0000000..3cc12c9 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_get_constant.gml @@ -0,0 +1,37 @@ +///nsp_get_constant(String) +/* +Underlying NSP script. Can be changed by user (read NSP Documentation for more info). +*/ +var work_str; + +work_str = argument0; + +switch (work_str) begin + + //Boolean: + case "true": return true; + + case "false": return false; + + //Mouse: + case "mb_left": return mb_left; + + case "mb_right": return mb_right; + + case "mb_middle": return mb_middle; + + //Keyboard: + case "vk_right": return vk_right; + + case "vk_left": return vk_left; + + case "vk_up": return vk_up; + + case "vk_down": return vk_down; + + case "vk_enter": return vk_enter; + + //If not a defined constant: + default: return -9999; + +end; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_get_token_type.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_get_token_type.gml new file mode 100644 index 0000000..2cb4272 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_get_token_type.gml @@ -0,0 +1,86 @@ +///nsp_get_token_type(Token, Following Token) +/* +Underlying NSP script. +Returns: Type of provided token (-1 if unknown) +*/ +var nspToken=global.nspToken; +var a, token, token_next; + +token = argument0; +token_next = argument1; + + if token == "{" or token == "}" + or token == "(" or token == ")" + or token == "," or token == ";" { + + return NSP_TYPE._symbol; + + } + else if token == nspToken[NSP_TOK.equal] + or token == nspToken[NSP_TOK.unequal] + or token == nspToken[NSP_TOK.larger] + or token == nspToken[NSP_TOK.larger_equal] + or token == nspToken[NSP_TOK.smaller] + or token == nspToken[NSP_TOK.smaller_equal] + or token == nspToken[NSP_TOK._and] + or token == nspToken[NSP_TOK._or] + or token == nspToken[NSP_TOK._xor] + or token == nspToken[NSP_TOK.add] + or token == nspToken[NSP_TOK.subtract] + or token == nspToken[NSP_TOK.multiply] + or token == nspToken[NSP_TOK.divide] + or token == nspToken[NSP_TOK._mod] + or token == nspToken[NSP_TOK._div] + or token == nspToken[NSP_TOK._power] + or token == nspToken[NSP_TOK.assign] { + + return NSP_TYPE._operator; + + } + else if nsp_is_number(token) { + + return NSP_TYPE._number; + + } + else if nsp_is_string(token) { + + return NSP_TYPE._string; + + } + else if nsp_is_special_word(token) { + + return NSP_TYPE._specword; + + } + else if (token_next == "(") { + + return NSP_TYPE._script; + + } + else if nsp_is_asset(token) { + + return NSP_TYPE._asset; + + } + else if nsp_is_dsm(token) { + + return NSP_TYPE._dsm; + + } + else { + + a = nsp_is_variable(token); + + if (a == 1) + return NSP_TYPE._variablesl; + + if (a == 2) + return NSP_TYPE._variablecl; + + if (a == 3) + return NSP_TYPE._variablegl; + + } + + return -1; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_gm_nom.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_gm_nom.gml new file mode 100644 index 0000000..3098431 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_gm_nom.gml @@ -0,0 +1,18 @@ +///nsp_gm_nom(String) +/* +Underlying NSP script. +Checks whether the given string contains only numbers, letters and _ +*/ +var t; + +for (t=1; t<=string_length(argument0); t+=1) begin + char=string_copy(argument0,t,1); + if (ord(char)>=48 and ord(char)<=57) + or (ord(char)>=65 and ord(char)<=90) + or (ord(char)>=97 and ord(char)<=122) + or char="_" {} + else return false; +end; + +return true; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_grid_shift.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_grid_shift.gml new file mode 100644 index 0000000..cbc5b26 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_grid_shift.gml @@ -0,0 +1,7 @@ +///nsp_grid_shift(Grid, Start, End) +/* +Underlying NSP script. +NOTE: There will be some excess data at the end of the grid! +*/ + +ds_grid_set_grid_region(argument0,argument0,argument2+1,0,ds_grid_width(argument0)-1,1,argument1,0); diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_asset.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_asset.gml new file mode 100644 index 0000000..5f842d6 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_asset.gml @@ -0,0 +1,11 @@ +///nsp_is_asset(String) +/* +Underlying NSP script. +*/ +var; + +if asset_get_type(argument0)<>asset_unknown + return true; + +return false; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_dsm.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_dsm.gml new file mode 100644 index 0000000..a9ffaa7 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_dsm.gml @@ -0,0 +1,18 @@ +///nsp_is_dsm(String) +/* +Underlying NSP script. +*/ +var nspToken=global.nspToken; +var work_str; + +work_str=argument0; + +/*if string_copy(work_str,1,string_length(nspToken[NSP_TOK.dsm_name])+1)= + nspToken[NSP_TOK.dsm_name]+"." + return true;*/ + +if work_str=nspToken[NSP_TOK.dsm_name] + return true; + +return false; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_equal.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_equal.gml new file mode 100644 index 0000000..ee79d30 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_equal.gml @@ -0,0 +1,11 @@ +///nsp_is_equal(Value 1, Value 2) +/* +Underlying NSP script. +*/ +var; + +if (is_string(argument0) + is_string(argument1)) <> 1 + return (argument0==argument1); + +return false; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_number.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_number.gml new file mode 100644 index 0000000..67b4b38 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_number.gml @@ -0,0 +1,23 @@ +///nsp_is_number(String) +/* +Underlying NSP script. +NOTE: Takes in account digits from 0 to 9, minus and dot signs. +*/ +var i; + +if string_digits(argument0)="" + return false; + +if string_copy(argument0,1,1)="-" + argument0=string_delete(argument0,1,1); + +for (i=1; i<=string_length(argument0); i+=1) begin + if !(string_copy(argument0,i,1)="." or + (ord(string_copy(argument0,i,1))>=48 and + ord(string_copy(argument0,i,1))<=57)) + return false; + +end; + +return true; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_script.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_script.gml new file mode 100644 index 0000000..1123295 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_script.gml @@ -0,0 +1,41 @@ +///nsp_is_script(String) +/* +Underlying NSP script. +*/ +var nspToken=global.nspToken; +var a,i,work_str,pri_q,pri_b; + +a=string_pos("(",argument0); + +if a<=1 or nsp_gm_nom(string_copy(argument0,1,a-1))=false + return false; + +//Find closed bracket: +work_str=argument0; +pri_b=0; +pri_q=1; +for (i=a; i<=string_length(work_str); i+=1) begin + + if string_copy(work_str,i,1)=nspToken[NSP_TOK.quote] + pri_q*=-1; + + if pri_q=1 { + if string_copy(work_str,i,1)="(" + pri_b+=1; + else if string_copy(work_str,i,1)=")" + pri_b-=1; + } + + if pri_q=1 and pri_b=0 and string_copy(work_str,i,1)=")" { + /*BREAK*/ + if i=string_length(work_str) { + return true; + break; + } + else { + return false; + break; + } + } + +end; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_special_word.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_special_word.gml new file mode 100644 index 0000000..ad51a42 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_special_word.gml @@ -0,0 +1,31 @@ +///nsp_is_special_word(String) +/* +Underlying NSP script. +*/ + +switch (argument0) begin + + case "self": return true; + + case "other": return true; + + case "with": return true; + + case "repeat": return true; + + case "if": return true; + + case "else": return true; + + case "while": return true; + + case "begin": return true; + + case "end": return true; + + case "return": return true; + + default: return false; + +end; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_string.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_string.gml new file mode 100644 index 0000000..6270750 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_string.gml @@ -0,0 +1,14 @@ +///nsp_is_string(String) +/* +Underlying NSP script. +*/ +var nspToken=global.nspToken; +var q; + +q=nspToken[NSP_TOK.quote]; + +if string_copy(argument0,1,1)==q and string_copy(argument0,string_length(argument0),1)==q +&& string_pos(q,nsp_string_crop_ext(argument0,q))=0 + return true + else return false; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_variable.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_variable.gml new file mode 100644 index 0000000..e715305 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_is_variable.gml @@ -0,0 +1,60 @@ +///nsp_is_variable(String) +/* +Underlying NSP script. +Returns: 0 - not a variable, 1 - simple local, 2 - complex local, 3 - global. +*/ +var nspToken=global.nspToken; +var i,work_str,temp_str,pri_q,pri_d; + +work_str=argument0; + +if nsp_gm_nom(argument0)=true + return 1; + +//Look for a dot: +pri_q=1; +pri_b=0; +dot_pos=0; +for (i=1; i<=string_length(work_str); i+=1) begin + + if string_copy(work_str,i,1)=nspToken[NSP_TOK.quote] + pri_q*=-1; + + if pri_q=1 { + if string_copy(work_str,i,1)="(" + pri_b+=1; + else if string_copy(work_str,i,1)=")" + pri_b-=1; + } + + if string_copy(work_str,i,1)="." { + dot_pos=i; + break; + } + +end; + +//Error checking: +if dot_pos=0 { + //nsp_notify("SCRIPT: nsp_is_variable. ERROR: No dot found and nomenclature mismatch ("+argument0+")."); + //return nspToken[NSP_TOK.abort]; + return 0; + } + +if nsp_gm_nom(string_delete(work_str,1,dot_pos))=false + return 0; + +temp_str=string_delete(work_str,dot_pos,string_length(work_str)); + +if temp_str="global" + return 3; + +if nsp_gm_nom(temp_str) +or nsp_is_asset(temp_str) +or nsp_is_number(temp_str) +or nsp_is_script(temp_str) + return 2; + +//Default: +return 0; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_remove.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_remove.gml new file mode 100644 index 0000000..992e387 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_remove.gml @@ -0,0 +1,15 @@ +///nsp_list_remove(Start, End, StrList, ParList) +/* +Underlying NSP script. +*/ +var nspListStr = argument2, + nspListPar = argument3; +var s,e; + +s = argument0; +e = argument1; + +repeat (e+1-s) { + ds_list_delete(nspListStr, s); + ds_list_delete(nspListPar, s); + } diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_set_types.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_set_types.gml new file mode 100644 index 0000000..42eb791 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_set_types.gml @@ -0,0 +1,33 @@ +///nsp_list_set_types(Token List, Types List) +/* +Underlying NSP script. +Returns: 1 = Success, 0 = Failure +*/ +var i, a, tok_list, typ_list; + +tok_list = argument0; +typ_list = argument1; + +for (i = 0; i < ds_list_size(tok_list)-1; i += 1) { + + a = nsp_get_token_type(tok_list[|i], tok_list[|i+1]); + + //DEBUG: + //show_message("Type of | "+tok_list[|i]+" | = "+nsp_type_name(a)); + + if (a == -1) return 0; + + ds_list_add(typ_list, a); + + } + +a = nsp_get_token_type(tok_list[|i], ""); + +//DEBUG: +//show_message("Type of | "+tok_list[|i]+" | = "+nsp_type_name(a)); + +if (a == -1) return 0; + +ds_list_add(typ_list, a); + +return 1; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_tidy_and_verify.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_tidy_and_verify.gml new file mode 100644 index 0000000..5899d0c --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_tidy_and_verify.gml @@ -0,0 +1,156 @@ +///nsp_list_tidy_and_verify(Token List, Param List) +/* + +Returns: 1 = Success, 0 = Failure + +*/ +var nspToken = global.nspToken; +var a, tok_list, typ_list; +var i, last; + +tok_list = argument0; +typ_list = argument1; + +last = ds_list_size(tok_list)-1; +i = last; + +while (i >= 0) { + + //DEBUG: + //show_message(tok_list[|i]+" | i = "+string(i)); + + switch (typ_list[|i]) { + + case NSP_TYPE._operator: + + //Operator at beginning or end: + if ((i == 0 and tok_list[|i] != "-" and tok_list[|i] != "+") or i == last) { + + NSP_notify("SCRIPT: nsp_list_tidy_and_verify. ERROR: Misplaced operator found at beginning or end of string."); + return 0; + + } + + //Fix unary minuses: + if (tok_list[|i] == "-") { + + if ((nsp_type_is_a_value(typ_list[|i+1]) or tok_list[|i+1] == "(" ) and + (i==0 or (!nsp_type_is_a_value(typ_list[|i-1]) and tok_list[|i-1] != ")"))) { + + //Replace unary minus with " -1 * " + + tok_list[|i] = "-1"; + typ_list[|i] = NSP_TYPE._number; + + ds_list_insert(tok_list, i+1, "*"); + ds_list_insert(typ_list, i+1, NSP_TYPE._operator); + + last += 1; + + } + + i -= 1; + continue; + + } + + //Fix unary pluses: + if (tok_list[|i] == "+") { + + if ((nsp_type_is_a_value(typ_list[|i+1]) or tok_list[|i+1] == "(" ) //Condition 1: Right-hand token is a value-type + and (i==0 or !(nsp_type_is_a_value(typ_list[|i-1]) or tok_list[|i-1] == ")"))) //Condition 2: Left hand token is not a value-type + { + + //Just delete the useless plus + ds_list_delete(tok_list, i); + ds_list_delete(typ_list, i); + last -= 1; + + } + + i -= 1; + continue; + + } + + //Operator at the beginning of string: + if (i == 0) { + + NSP_notify("SCRIPT: nsp_list_tidy_and_verify. ERROR: Misplaced operator found at the beginning of the input string."); + return 0; + + } + + //Operator next to another operator: + if (typ_list[|i-1] == NSP_TYPE._operator or typ_list[|i+1] == NSP_TYPE._operator) { + + //Ignore compound assignment operators: + if (tok_list[|i] == nspToken[NSP_TOK.assign] and typ_list[|i-1] == NSP_TYPE._operator and typ_list[|i+1] != NSP_TYPE._operator) { + + if (tok_list[|i-1] == nspToken[NSP_TOK.add] or + tok_list[|i-1] == nspToken[NSP_TOK.subtract] or + tok_list[|i-1] == nspToken[NSP_TOK.multiply] or + tok_list[|i-1] == nspToken[NSP_TOK.divide]) { + + i -= 2; + continue; + + } + + } + + NSP_notify("SCRIPT: nsp_list_tidy_and_verify. ERROR: Misplaced operator found at beginning or end of string or next to another operator."); + return 0; + + } + + //Operator after non-value: + if (!nsp_type_is_a_value(typ_list[|i-1])) { + + if (tok_list[|i-1] == ")") { + + i-= 1; + continue; + + } + + NSP_notify("SCRIPT: nsp_list_tidy_and_verify. ERROR: Misplaced operator found after a symbol or keyword."); + return 0; + + } + + //No problem found: + i -= 1; + + break; + + case NSP_TYPE._symbol: + + //Add a semicolon after a closed curly bracket to prevent crashes: + if (tok_list[|i] == "}" and i!= last and tok_list[|i+1] != ";") { + + ds_list_insert(tok_list, i+1, ";"); + ds_list_insert(typ_list, i+1, NSP_TYPE._symbol); + + last += 1; + + i-=1; + continue; + + } + + //No problems found: + i -= 1; + + break; + + default: + i -= 1; + continue; + break; + + } + + } + +return 1; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_to_string.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_to_string.gml new file mode 100644 index 0000000..bdafe97 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_list_to_string.gml @@ -0,0 +1,15 @@ +///nsp_list_to_string(List, Start, End, Separator); +/* +Underlying NSP script. +*/ +//var nspListStr=global.nspListStr; +var i,s; + +s=""; +for (i=argument1; i<=argument2; i+=1) begin + + s+=argument0[|i]+argument3; + +end; + +return s; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_src_token.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_src_token.gml new file mode 100644 index 0000000..17f73e7 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_src_token.gml @@ -0,0 +1,7 @@ +///nsp_src_token(String, Position, Token) +/* +Underlying NSP script. +*/ +var nspToken=global.nspToken; + +return string_copy(argument0,argument1,string_length(nspToken[argument2]))==nspToken[argument2]; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_statement_positions.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_statement_positions.gml new file mode 100644 index 0000000..0c82758 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_statement_positions.gml @@ -0,0 +1,72 @@ +///nsp_statement_positions(Start, End, Statement, StrList) +/* +Underlying NSP script. +*/ +var nspListStr = argument3, + nspToken = global.nspToken; +var a,i,pos_1,pos_2,pos_3,list_min,list_max; + +//Set up: +list_min=argument0; +list_max=argument1; + +//Searching: + pos_1=-1; + for (i=list_min; i<=list_max; i+=1) begin + if nspListStr[|i]="(" { + pos_1=i; + break; + } + + if i=list_max { + NSP_notify("SCRIPT: nsp_statement_positions. ERROR: (1) Syntax error ("+argument2+" statement).",nspListStr,list_min,list_max); + return nspToken[NSP_TOK.abort]; + } + end; + + pri_b=0; + pos_2=-1; + for (i=pos_1+1; i<=list_max; i+=1) begin + if nspListStr[|i]="(" + pri_b+=1 + else if nspListStr[|i]=")" { + if pri_b=0 { + pos_2=i; + break; + } + else pri_b-=1; + } + + if i=list_max { + NSP_notify("SCRIPT: nsp_statement_positions. ERROR: (2) Syntax error ("+argument2+" statement).",nspListStr,list_min,list_max); + return nspToken[NSP_TOK.abort]; + } + end; + + pri_b=0; + pos_3=-1; + for (i=pos_2+1; i<=list_max; i+=1) begin + + if nspListStr[|i]="{" + pri_b+=1; + else if nspListStr[|i]="}" + pri_b-=1; + + if (nspListStr[|i]=";" or i=list_max) and pri_b=0 { + pos_3=i; + + break; + } + + if i=list_max and pos_3=-1 { + NSP_notify("SCRIPT: nsp_statement_positions. ERROR: (3) Syntax error ("+argument2+" statement).",nspListStr,list_min,list_max); + return nspToken[NSP_TOK.abort]; + } + end; + +//Returning: +a[0]=pos_1; +a[1]=pos_2; +a[2]=pos_3; + +return a; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_crop.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_crop.gml new file mode 100644 index 0000000..2c9a4cd --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_crop.gml @@ -0,0 +1,25 @@ +///nsp_string_crop(String) +/* +Removes all matches of " " from the beginning and the end of the string argument0. +*/ +var cond_str,work_str; + +work_str=argument0; +cond_str=" "; + +//Crop from the beginning: +while (string_copy(work_str,1,string_length(cond_str))=cond_str) { + + work_str=string_delete(work_str,1,string_length(cond_str)); + + } + +//Crop from the end: +while (string_copy(work_str,string_length(work_str)-string_length(cond_str)+1,string_length(cond_str))=cond_str) { + + work_str=string_delete(work_str,string_length(work_str)-string_length(cond_str)+1,string_length(cond_str)); + + } + +return work_str; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_crop_ext.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_crop_ext.gml new file mode 100644 index 0000000..82df900 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_crop_ext.gml @@ -0,0 +1,25 @@ +///nsp_string_crop_ext(String, Condition) +/* +Removes all matches of argument1 from the beginning and the end of the string argument0. +*/ +var cond_str,work_str; + +work_str=argument0; +cond_str=argument1; + +//Crop from the beginning: +while (string_copy(work_str,1,string_length(cond_str))=cond_str) { + + work_str=string_delete(work_str,1,string_length(cond_str)); + + } + +//Crop from the end: +while (string_copy(work_str,string_length(work_str)-string_length(cond_str)+1,string_length(cond_str))=cond_str) { + + work_str=string_delete(work_str,string_length(work_str)-string_length(cond_str)+1,string_length(cond_str)); + + } + +return work_str; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_find_last.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_find_last.gml new file mode 100644 index 0000000..1f0054a --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_find_last.gml @@ -0,0 +1,21 @@ +///nsp_string_find_last(String, Substring) +/* +Return the position of the last match of argument1 in argument0 (0 if not found). +*/ +var i,t,work_str; + +work_str=argument0; + +if string_pos(argument1,work_str)=0 return 0; + +for (i=1; i<=string_length(work_str); i+=1) begin + t=string_length(work_str)-i+1; + + if string_copy(work_str,t,string_length(argument1))=argument1 { + break; + } + +end; + +return t; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_force.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_force.gml new file mode 100644 index 0000000..c44ada6 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_string_force.gml @@ -0,0 +1,10 @@ +///nsp_string_force(Value) +/* +Returns input as a string. +*/ + +if is_string(argument0) + return argument0; + +return string(argument0); + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_token_is_valid.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_token_is_valid.gml new file mode 100644 index 0000000..e4a78f8 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_token_is_valid.gml @@ -0,0 +1,26 @@ +///nsp_token_is_valid(Token, Surrounding) +/* +Underlying NSP script. +*/ +var ord1, ord2; + +if (string_letters(argument0) != argument0) return true; + +ord1 = ord( string_copy(argument1,1,1) ); +ord2 = ord( string_copy(argument1,string_length(argument1),1) ); + +// 65 - 90 Letters +// 97 - 122 Letters +// 48 - 57 Digits +// 95 Underscore + +if ((ord1 >= 65 and ord1 <= 90) or (ord1 >= 97 and ord1 <= 122) + or (ord1 == 95)) + return false; + +if ((ord2 >= 65 and ord2 <= 90) or (ord2 >= 97 and ord2 <= 122) + or (ord2 == 95) or (ord2 >= 48 and ord2 <= 57)) + return false; + +return true; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_tokenize.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_tokenize.gml new file mode 100644 index 0000000..e884781 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_tokenize.gml @@ -0,0 +1,224 @@ +///nsp_tokenize(String, Token List) +/* +Underlying NSP script. +Returns: 1 = Success, 0 = Failure +*/ +var i, work_str, pri_q, token, tokenArray, list; +var copy_1, copy_2, copy_3; + +//Setup: +work_str = argument0; +list = argument1; + +tokenArray = global.nspToken; + +work_str = nsp_string_crop(work_str); + +//*** TOKENIZATION LOOP *** +while (string_length(work_str) > 0) { + + pri_q = 1; + token = ""; + + for (i = 1; i <= string_length(work_str); i += 1) begin + + copy_1=string_copy(work_str,i,1); + copy_2=string_copy(work_str,i,2); + copy_3=string_copy(work_str,i,3); + + if string_copy(work_str,i,1)=tokenArray[NSP_TOK.quote] + pri_q*=-1; + + //Check for tokens: + if (pri_q==1) { + + //Whitespace: + if (copy_1)=" " { + if i<>1 { + ds_list_add(list,string_copy(work_str,1,i-1)); + work_str=string_delete(work_str,1,i); + break; + } + + } + //Complex locals: + else if (copy_1=".") { + if i<>1 and string_digits(string_copy(work_str,i+1,1))<>string_copy(work_str,i+1,1) { + ds_list_add(list,string_copy(work_str,1,i-1)); + work_str=string_delete(work_str,1,i-1); + break; + } + + } + //Default tokens: + else if ( copy_1="{" + or copy_1="}" + or copy_1="(" + or copy_1=")" + or copy_1=";" + or copy_1="," ) { + + token=copy_1; + + if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); + ds_list_add(list,token); + work_str=string_delete(work_str,1,i); + break; + + } + //Tokens of length 3: + else if ( copy_3=tokenArray[NSP_TOK.multiply] + or copy_3=tokenArray[NSP_TOK.divide] + or copy_3=tokenArray[NSP_TOK._div] + or copy_3=tokenArray[NSP_TOK._mod] + or copy_3=tokenArray[NSP_TOK._power] + or copy_3=tokenArray[NSP_TOK.add] + or copy_3=tokenArray[NSP_TOK.subtract] + or copy_3=tokenArray[NSP_TOK.equal] + or copy_3=tokenArray[NSP_TOK.larger] + or copy_3=tokenArray[NSP_TOK.larger_equal] + or copy_3=tokenArray[NSP_TOK.smaller] + or copy_3=tokenArray[NSP_TOK.smaller_equal] + or copy_3=tokenArray[NSP_TOK.unequal] + or copy_3=tokenArray[NSP_TOK._and] + or copy_3=tokenArray[NSP_TOK._or] + or copy_3=tokenArray[NSP_TOK._xor] + or copy_3=tokenArray[NSP_TOK.assign] ) { + + token=copy_3; + if nsp_token_is_valid(token,string_copy(work_str,i-1,3+2)) { + + if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); + ds_list_add(list,token); + work_str=string_delete(work_str,1,i+2); + break; + + } + + } + //Tokens of length 2: + else if ( copy_2=tokenArray[NSP_TOK.multiply] + or copy_2=tokenArray[NSP_TOK.divide] + or copy_2=tokenArray[NSP_TOK._div] + or copy_2=tokenArray[NSP_TOK._mod] + or copy_2=tokenArray[NSP_TOK._power] + or copy_2=tokenArray[NSP_TOK.add] + or copy_2=tokenArray[NSP_TOK.subtract] + or copy_2=tokenArray[NSP_TOK.equal] + or copy_2=tokenArray[NSP_TOK.larger] + or copy_2=tokenArray[NSP_TOK.larger_equal] + or copy_2=tokenArray[NSP_TOK.smaller] + or copy_2=tokenArray[NSP_TOK.smaller_equal] + or copy_2=tokenArray[NSP_TOK.unequal] + or copy_2=tokenArray[NSP_TOK._and] + or copy_2=tokenArray[NSP_TOK._or] + or copy_2=tokenArray[NSP_TOK._xor] + or copy_2=tokenArray[NSP_TOK.assign] ) { + + token=copy_2; + if nsp_token_is_valid(token,string_copy(work_str,i-1,2+2)) { + + if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); + ds_list_add(list,token); + work_str=string_delete(work_str,1,i+1); + break; + + } + + } + //Tokens of length 1: + else if ( copy_1=tokenArray[NSP_TOK.multiply] + or copy_1=tokenArray[NSP_TOK.divide] + or copy_1=tokenArray[NSP_TOK._div] + or copy_1=tokenArray[NSP_TOK._mod] + or copy_1=tokenArray[NSP_TOK._power] + or copy_1=tokenArray[NSP_TOK.add] + or copy_1=tokenArray[NSP_TOK.subtract] + or copy_1=tokenArray[NSP_TOK.equal] + or copy_1=tokenArray[NSP_TOK.larger] + or copy_1=tokenArray[NSP_TOK.larger_equal] + or copy_1=tokenArray[NSP_TOK.smaller] + or copy_1=tokenArray[NSP_TOK.smaller_equal] + or copy_1=tokenArray[NSP_TOK.unequal] + or copy_1=tokenArray[NSP_TOK._and] + or copy_1=tokenArray[NSP_TOK._or] + or copy_1=tokenArray[NSP_TOK._xor] + or copy_1=tokenArray[NSP_TOK.assign] ) { + + token=copy_1; + if nsp_token_is_valid(token,string_copy(work_str,i-1,1+2)) { + + if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); + ds_list_add(list,token); + work_str=string_delete(work_str,1,i); + break; + + } + + } + else if i=string_length(work_str) { + ds_list_add(list,work_str); + work_str=""; + break; + } + + } + + end; + + } + +//*** TIDY UP 1 *** +i = ds_list_size(list)-1; + +while (i >= 0) { + + list[|i] = nsp_string_crop(list[|i]); + + switch (list[|i]) begin + + case "begin": + list[|i] = "{"; + break; + + case "end": + list[|i] = "}"; + break; + + case "global": + if (i != ds_list_size(list)-1) { + + list[|i+1] = "global" + nsp_string_crop(list[|i+1]); + ds_list_delete(list, i); + + } + else + return 0; + break; + + case "": + ds_list_delete(list,i); + break; + + default: + var c; + c = nsp_get_constant(list[|i]); + if (c != -9999) + list[|i] = string(c); + break; + + end; + + i -= 1; + + } + +//DEBUG: +//show_message("Input string: "+argument0); +//show_message("Tokenized string: "+nsp_list_to_string(list, 0, ds_list_size(list)-1, " | ")); + +return 1; + + + + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_type_is_a_value.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_type_is_a_value.gml new file mode 100644 index 0000000..c95b337 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_type_is_a_value.gml @@ -0,0 +1,19 @@ +///nsp_type_is_a_value(Type) +/* + +*/ +var type; + +type = argument[0]; + +if (type == NSP_TYPE._number or + type == NSP_TYPE._string or + type == NSP_TYPE._script or + type == NSP_TYPE._asset or + type == NSP_TYPE._variablesl or + type == NSP_TYPE._variablecl or + type == NSP_TYPE._variablegl or + type == NSP_TYPE._dsm) + return 1; + +return 0; diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_type_name.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_type_name.gml new file mode 100644 index 0000000..f3f4af8 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_type_name.gml @@ -0,0 +1,35 @@ +///nsp_type_name(Type) +/* + +*/ +var type; + +type = argument[0]; + +switch (type) { + + case NSP_TYPE._symbol: return "symbol"; + + case NSP_TYPE._operator: return "operator"; + + case NSP_TYPE._number: return "number"; + + case NSP_TYPE._string: return "string"; + + case NSP_TYPE._script: return "script (function)"; + + case NSP_TYPE._asset: return "asset"; + + case NSP_TYPE._variablesl: return "variable (sl)"; + + case NSP_TYPE._variablecl: return "variable (cl)"; + + case NSP_TYPE._variablegl: return "variable (gl)"; + + case NSP_TYPE._dsm: return "dsm"; + + case NSP_TYPE._specword: return "specword"; + + default: return "unknown"; + + } diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get.gml new file mode 100644 index 0000000..ee610dc --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get.gml @@ -0,0 +1,30 @@ +///nsp_variable_get(Instance, Variable) +/* +Underlying NSP script. Can be changed by user (read NSP Documentation for more info). +*/ +var nspToken=global.nspToken; + +if !instance_exists(argument0) { + NSP_notify("SCRIPT: nsp_variable_get. ERROR: Trying to reference non-existing instance."); + return nspToken[NSP_TOK.abort]; + } + +switch (argument1) begin + + case "x": + return (argument0).x; + break; + + case "y": + return (argument0).y; + break; + + // Add more here... + + default: + NSP_notify("SCRIPT: nsp_variable_get. ERROR: Variable not supported ("+argument1+")."); + return nspToken[NSP_TOK.abort]; + break; + +end; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get_br.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get_br.gml new file mode 100644 index 0000000..7a2cd98 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get_br.gml @@ -0,0 +1,15 @@ +///nsp_variable_get_br(Instance, Variable) +/* +Underlying NSP script. +*/ + +if (NSP_VAR_SYS.new == 1) { + + return nsp_variable_get_new(argument0, argument1); + + } +else { + + return nsp_variable_get(argument0, argument1); + + } diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get_new.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get_new.gml new file mode 100644 index 0000000..1057ab9 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_get_new.gml @@ -0,0 +1,39 @@ +///nsp_variable_get_new(Instance, Variable) +/* +Underlying NSP script. +*/ +var nspToken = global.nspToken; +var inst, varname, val; + +inst = argument[0]; +varname = argument[1]; + +//DEBUG: +//show_message("Fetching "+varname+" -> "+nsp_string_force(variable_instance_get(inst, varname))); + +if (inst < 10000) { + + if (instance_number(inst) == 0) { + NSP_notify("SCRIPT: nsp_variable_get_new. ERROR: Trying to reference non-existing instance."); + exit; + } + + inst = instance_find(inst, 0); + + } + +if (!instance_exists(inst)) { + + NSP_notify("SCRIPT: nsp_variable_get_new. ERROR: Trying to reference non-existing instance."); + return nspToken[NSP_TOK.abort]; + + } + +if (!variable_instance_exists(inst, varname)) { + + NSP_notify("SCRIPT: nsp_variable_get_new. ERROR: Trying to fetch a non-existant variable ( "+varname+" )."); + return nspToken[NSP_TOK.abort]; + + } + +return variable_instance_get(inst, varname); diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get.gml new file mode 100644 index 0000000..2052443 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get.gml @@ -0,0 +1,31 @@ +///nsp_variable_global_get(Name) +/* +Underlying NSP script.. +*/ +var nspToken=global.nspToken; +var work_str; + +work_str=argument0; + +if string_copy(argument0,1,7)="global." + work_str=string_delete(work_str,1,7); + +switch (work_str) begin + + case "room_speed": + return room_speed; + break; + + case "state": + return global.state; + break; + + // Add more here... + + default: + NSP_notify("SCRIPT: nsp_variable_global_get. ERROR: Variable not supported ("+argument0+")."); + return nspToken[NSP_TOK.abort]; + break; + +end; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get_br.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get_br.gml new file mode 100644 index 0000000..e3b2863 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get_br.gml @@ -0,0 +1,15 @@ +///nsp_variable_global_get_br(Variable) +/* +Underlying NSP script. +*/ + +if (NSP_VAR_SYS.new == 1) { + + return nsp_variable_global_get_new(argument0); + + } +else { + + return nsp_variable_global_get(argument0); + + } diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get_new.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get_new.gml new file mode 100644 index 0000000..e55ba8e --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_get_new.gml @@ -0,0 +1,24 @@ +///nsp_variable_global_get_new(Name) +/* +Underlying NSP script. +*/ +var nspToken = global.nspToken; +var varname; + +varname = argument[0]; + +if (string_copy(varname, 1, 7) == "global.") { + + varname = string_delete(varname, 1, 7); + + } + +if (!variable_global_exists(varname)) { + + NSP_notify("SCRIPT: nsp_variable_global_get_new. ERROR: Trying to fetch a non-existant global variable ("+varname+")."); + return nspToken[NSP_TOK.abort]; + + } + +return variable_global_get(varname); + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set.gml new file mode 100644 index 0000000..7030231 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set.gml @@ -0,0 +1,35 @@ +///nsp_variable_global_set(Name, Value) +/* +Underlying NSP script. +*/ +var work_str; + +work_str=argument0; + +if is_string(argument1) { + if nsp_is_string(argument1) + argument1=string_copy(argument1,2,string_length(argument1)-2); + } + +if string_copy(argument0,1,7)="global." + work_str=string_delete(work_str,1,7); + +switch (work_str) begin + + case "room_speed": + room_speed = argument1; + break; + + case "state": + global.state = argument1; + break; + + // Add more here... + + default: + NSP_notify("SCRIPT: nsp_variable_global_set. ERROR: Variable not supported ("+argument0+")."); + break; + +end; + + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set_br.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set_br.gml new file mode 100644 index 0000000..6d34d08 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set_br.gml @@ -0,0 +1,15 @@ +///nsp_variable_global_set_br(Variable, Value) +/* +Underlying NSP script. +*/ + +if (NSP_VAR_SYS.new == 1) { + + nsp_variable_global_set_new(argument0, argument1); + + } +else { + + nsp_variable_global_set(argument0, argument1); + + } diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set_new.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set_new.gml new file mode 100644 index 0000000..f953107 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_global_set_new.gml @@ -0,0 +1,23 @@ +///nsp_variable_global_set_new(Name, Value) +/* +Underlying NSP script. +*/ +var varname, val; + +varname = argument[0]; +val = argument[1]; + +if (is_string(val) and nsp_is_string(val)) { + + val = string_copy(val, 2, string_length(val)-2); + + } + +if (string_copy(varname, 1, 7) == "global.") { + + varname=string_delete(varname, 1, 7); + + } + +variable_global_set(varname, val); + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set.gml new file mode 100644 index 0000000..389ff24 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set.gml @@ -0,0 +1,33 @@ +///nsp_variable_set(Instance, Variable, Value) +/* +Underlying NSP script. Can be changed by user (read NSP Documentation for more info). +*/ +if !instance_exists(argument0) { + NSP_notify("SCRIPT: nsp_variable_set. ERROR: Trying to reference non-existing instance."); + exit; + } + +if is_string(argument2) { + if nsp_is_string(argument2) + argument2=string_copy(argument2,2,string_length(argument2)-2); + } + +switch (argument1) begin + + case "x": + (argument0).x = argument2; + break; + + case "y": + (argument0).y = argument2; + break; + + // Add more here... + + default: + NSP_notify("SCRIPT: nsp_variable_set. ERROR: Variable not supported ("+argument1+")."); + exit; + break; + +end; + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set_br.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set_br.gml new file mode 100644 index 0000000..6a2fd79 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set_br.gml @@ -0,0 +1,17 @@ +///nsp_variable_set_br(Instance, Variable, Value) +/* +Underlying NSP script. +*/ + +if (NSP_VAR_SYS.new == 1) { + + nsp_variable_set_new(argument0, argument1, argument2); + + } +else { + + nsp_variable_set(argument0, argument1, argument2); + + } + + diff --git a/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set_new.gml b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set_new.gml new file mode 100644 index 0000000..7f25146 --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/Assets/Scripts/nsp_variable_set_new.gml @@ -0,0 +1,39 @@ +///nsp_variable_set_new(Instance, Variable, Value) +/* +Underlying NSP script. +*/ +var inst, varname, val; + +inst = argument[0]; +varname = argument[1]; +val = argument[2]; + +//DEBUG: +//show_message("Setting "+varname+" to "+nsp_string_force(val)); + +if (inst < 10000) { + + if (instance_number(inst) == 0) { + NSP_notify("SCRIPT: nsp_variable_set_new. ERROR: Trying to reference non-existing instance."); + exit; + } + + inst = instance_find(inst, 0); + + } + +if (!instance_exists(inst)) { + + NSP_notify("SCRIPT: nsp_variable_set_new. ERROR: Trying to reference non-existing instance."); + exit; + + } + +if (is_string(val) and nsp_is_string(val)) { + + val = string_copy(val, 2, string_length(val)-2); + + } + +variable_instance_set(inst, varname, val); + diff --git a/source.gmx/extensions/N String Parser 2/yymanifest.xml b/source.gmx/extensions/N String Parser 2/yymanifest.xml new file mode 100644 index 0000000..c4c454b --- /dev/null +++ b/source.gmx/extensions/N String Parser 2/yymanifest.xml @@ -0,0 +1,72 @@ + + + + N String Parser 2.extension.gmx + N String Parser 2\Assets\Scripts\nsp_arithmetic_calculate.gml + N String Parser 2\Assets\Scripts\nsp_build_grid.gml + N String Parser 2\Assets\Scripts\NSP_check_saved.gml + N String Parser 2\Assets\Scripts\nsp_combination_calculate.gml + N String Parser 2\Assets\Scripts\nsp_comparison_calculate.gml + N String Parser 2\Assets\Scripts\nsp_convert_to_list.gml + N String Parser 2\Assets\Scripts\NSP_Documentation.gml + N String Parser 2\Assets\Scripts\nsp_dsm_get.gml + N String Parser 2\Assets\Scripts\nsp_dsm_set.gml + N String Parser 2\Assets\Scripts\NSP_evaluate.gml + N String Parser 2\Assets\Scripts\nsp_evaluate_list.gml + N String Parser 2\Assets\Scripts\nsp_evaluate_long.gml + N String Parser 2\Assets\Scripts\NSP_evaluate_saved.gml + N String Parser 2\Assets\Scripts\nsp_evaluate_single.gml + N String Parser 2\Assets\Scripts\nsp_evaluate_special_word.gml + N String Parser 2\Assets\Scripts\nsp_execute_block.gml + N String Parser 2\Assets\Scripts\nsp_execute_line.gml + N String Parser 2\Assets\Scripts\nsp_execute_master.gml + N String Parser 2\Assets\Scripts\NSP_execute_saved.gml + N String Parser 2\Assets\Scripts\nsp_execute_script.gml + N String Parser 2\Assets\Scripts\nsp_execute_single.gml + N String Parser 2\Assets\Scripts\NSP_execute_string.gml + N String Parser 2\Assets\Scripts\NSP_free.gml + N String Parser 2\Assets\Scripts\NSP_free_saved.gml + N String Parser 2\Assets\Scripts\nsp_get_constant.gml + N String Parser 2\Assets\Scripts\nsp_get_token_type.gml + N String Parser 2\Assets\Scripts\nsp_gm_nom.gml + N String Parser 2\Assets\Scripts\nsp_grid_shift.gml + N String Parser 2\Assets\Scripts\NSP_initialize.gml + N String Parser 2\Assets\Scripts\nsp_is_asset.gml + N String Parser 2\Assets\Scripts\nsp_is_dsm.gml + N String Parser 2\Assets\Scripts\nsp_is_equal.gml + N String Parser 2\Assets\Scripts\nsp_is_number.gml + N String Parser 2\Assets\Scripts\nsp_is_script.gml + N String Parser 2\Assets\Scripts\nsp_is_special_word.gml + N String Parser 2\Assets\Scripts\nsp_is_string.gml + N String Parser 2\Assets\Scripts\nsp_is_variable.gml + N String Parser 2\Assets\Scripts\nsp_list_remove.gml + N String Parser 2\Assets\Scripts\nsp_list_set_types.gml + N String Parser 2\Assets\Scripts\nsp_list_tidy_and_verify.gml + N String Parser 2\Assets\Scripts\nsp_list_to_string.gml + N String Parser 2\Assets\Scripts\NSP_notify.gml + N String Parser 2\Assets\Scripts\NSP_save.gml + N String Parser 2\Assets\Scripts\nsp_src_token.gml + N String Parser 2\Assets\Scripts\nsp_statement_positions.gml + N String Parser 2\Assets\Scripts\nsp_string_crop.gml + N String Parser 2\Assets\Scripts\nsp_string_crop_ext.gml + N String Parser 2\Assets\Scripts\nsp_string_find_last.gml + N String Parser 2\Assets\Scripts\nsp_string_force.gml + N String Parser 2\Assets\Scripts\nsp_tokenize.gml + N String Parser 2\Assets\Scripts\nsp_token_is_valid.gml + N String Parser 2\Assets\Scripts\nsp_type_is_a_value.gml + N String Parser 2\Assets\Scripts\nsp_type_name.gml + N String Parser 2\Assets\Scripts\nsp_variable_get.gml + N String Parser 2\Assets\Scripts\nsp_variable_get_br.gml + N String Parser 2\Assets\Scripts\nsp_variable_get_new.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_get.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_get_br.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_get_new.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_set.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_set_br.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_set_new.gml + N String Parser 2\Assets\Scripts\nsp_variable_set.gml + N String Parser 2\Assets\Scripts\nsp_variable_set_br.gml + N String Parser 2\Assets\Scripts\nsp_variable_set_new.gml + NbfUZYPxmsKxVndmk4M2CeV1sHtEBAFmGwtEzNA5O2vIcExTfoyna3i7S2KFDRx1U2kLDRLJvpVxDMJbHMXE0F1wNeNHtF1obYD3mLGJO6O5eW1TBHp1R945QrPCnErY7xQfWnXmQPhK5BgcgtjWOvwAhlZ1hXoir+Snx+KlBMr8GgzIm1NHwvT7Zau8mteGP5B+mZUq9SFo59zvSQDHRuUeHBr/Yp5T1HJHzvnAdvAlxMPv9RzWDYb+lCONrIIGSwx1F3F8dZQ8XbivCOt+Y2bkql4BaUK81r0B/mpaA0UXfbVdvjyKj86HFdR+DnZhB6I5cn53y81vVqqSzPs4Sw== + 2D2D2D2D2D424547494E205055424C4943204B45592D2D2D2D2D0A4D494942496A414E42676B71686B6947397730424151454641414F43415138414D49494243674B4341514541776D43313443613367722F51426D7667304171640A505A387971473544314235652B67326C6371446F327746714F744C684E596362454E6C4E535649486C527A332F367234583063776F6F764F646C33695A745A470A6C4B6C724B514A764E4950612F4741484F2F785045494579794C36735955636133694172394D416F4A7258786456554D594644536859716F526472446B4969750A586D36307871714458566C5052616F67356A7350484C69417157665A38395159476F336F475A3447546D2B4F2B4C676568554C7A6B6E6257656B6437363963500A4C74674D326F69445234507735565A646951375A3630567A677465506441326A615A6F672B42303935377A5438556C7852665551526B4D56784F553050456B760A767A75364C6E594F304B7854344F692B68702F46665737645951304C777131615750317A6B706841556649433274424E68385446563374436D4F3543454B34350A57514944415141420A2D2D2D2D2D454E44205055424C4943204B45592D2D2D2D2D0A + diff --git a/source.gmx/extensions/libjtool.extension.gmx b/source.gmx/extensions/libjtool.extension.gmx new file mode 100644 index 0000000..f99edd7 --- /dev/null +++ b/source.gmx/extensions/libjtool.extension.gmx @@ -0,0 +1,267 @@ + + + libjtool + 1.0.1 + + + 31/01/18 + Free to use, also for commercial games. + + + + + + + + + + + + + + + + + + + + 743440578 + + + + + + + libjtool.dll + extensions\libjtool.dll + + + 1 + 0 + + + 743440578 + + + + + libjtool.dylib + 2 + + + libjtool.so + 134217856 + + + + + ini_open + ini_open + 12 + ini_open(path) + 2 + 1 + + 1 + + + + ini_read_string + ini_read_string + 12 + ini_read_string(section, key, default) + 1 + 3 + + 1 + 1 + 1 + + + + file_text_open_read + file_text_open_read + 12 + file_text_open_read(path) + 2 + 1 + + 1 + + + + file_text_read_string + file_text_read_string + 12 + file_text_read_string(handle) + 1 + 1 + + 2 + + + + file_text_close + file_text_close + 12 + file_text_close(handle) + 2 + 1 + + 2 + + + + file_text_open_write + file_text_open_write + 12 + file_text_open_write(path) + 2 + 1 + + 1 + + + + file_text_write_string + file_text_write_string + 12 + file_text_write_string(handle, value) + 2 + 2 + + 2 + 1 + + + + file_text_writeln + file_text_writeln + 12 + file_text_writeln(handle) + 2 + 1 + + 2 + + + + file_copy + file_copy + 12 + file_copy(file, destination) + 2 + 2 + + 1 + 1 + + + + file_delete + file_delete + 12 + file_delete(path) + 2 + 1 + + 1 + + + + directory_exists + directory_exists + 12 + directory_exists(path) + 2 + 1 + + 1 + + + + directory_create + directory_create + 12 + directory_create(path) + 2 + 1 + + 1 + + + + ini_write_string + ini_write_string + 12 + ini_write_string(section, key, value) + 2 + 3 + + 1 + 1 + 1 + + + + ini_close + ini_close + 12 + ini_close() + 1 + 0 + + + + file_text_open_append + file_text_open_append + 12 + file_text_open_append(path) + 2 + 1 + + 1 + + + + ini_read_real + ini_read_real + 12 + ini_read_real(section, key, value) + 2 + 3 + + 1 + 1 + 2 + + + + ini_write_real + ini_write_real + 12 + ini_write_real(section, key, value) + 2 + 3 + + 1 + 1 + 2 + + + + file_exists + file_exists + 12 + file_exists(path) + 2 + 1 + + 1 + + + + + + + diff --git a/source.gmx/extensions/libjtool/libjtool.dll b/source.gmx/extensions/libjtool/libjtool.dll new file mode 100644 index 0000000..192a0ee Binary files /dev/null and b/source.gmx/extensions/libjtool/libjtool.dll differ diff --git a/source.gmx/extensions/libjtool/libjtool.dylib b/source.gmx/extensions/libjtool/libjtool.dylib new file mode 100644 index 0000000..828725f Binary files /dev/null and b/source.gmx/extensions/libjtool/libjtool.dylib differ diff --git a/source.gmx/extensions/libjtool/libjtool.ext b/source.gmx/extensions/libjtool/libjtool.ext new file mode 100644 index 0000000..e69de29 diff --git a/source.gmx/extensions/libjtool/libjtool.so b/source.gmx/extensions/libjtool/libjtool.so new file mode 100644 index 0000000..42cd602 Binary files /dev/null and b/source.gmx/extensions/libjtool/libjtool.so differ diff --git a/source.gmx/extensions/window_command_hook.extension.gmx b/source.gmx/extensions/window_command_hook.extension.gmx new file mode 100644 index 0000000..7d40694 --- /dev/null +++ b/source.gmx/extensions/window_command_hook.extension.gmx @@ -0,0 +1,271 @@ + + + window_command_hook + 1.0.0 + + + 18/02/17 + Proprietary + + + + + + + + + + + + + + + + + + + + 542113856 + + + + + + + window_command_hook.dll + extensions\window_command_hook.dll + + window_command_cleanup + 1 + 0 + + + 113497714299118 + + + + + + window_command_run_raw + window_command_run_raw + 11 + + 2 + 3 + + 1 + 2 + 2 + + + + window_command_cleanup + window_command_cleanup + 11 + + 2 + 0 + + + + window_command_init_raw + window_command_init_raw + 11 + + 2 + 1 + + 1 + + + + window_command_hook_raw + window_command_hook_raw + 11 + + 2 + 2 + + 1 + 2 + + + + window_command_unhook_raw + window_command_unhook_raw + 11 + + 2 + 1 + + 2 + + + + window_command_get_active_raw + window_command_get_active_raw + 11 + + 2 + 2 + + 1 + 2 + + + + window_command_set_active_raw + window_command_set_active_raw + 11 + + 2 + 3 + + 1 + 2 + 2 + + + + window_command_check + window_command_check + 11 + window_command_check(button) : Returns whether the given button was pressed since the last call to this function. + 2 + 1 + + 2 + + + + window_command_bind_raw + window_command_bind_raw + 11 + + 2 + 1 + + 1 + + + + + + + window_command_hook.gml + extensions\gml.gml + + + 2 + 0 + + + 9223372036854775807 + + + + + + window_command_init + window_command_init + 11 + + 2 + 0 + + + + window_command_hook + window_command_hook + 11 + window_command_hook(index) : Hooks the specified command + 2 + 1 + + 2 + + + + window_command_unhook + window_command_unhook + 11 + window_command_unhook(index) + 2 + 1 + + 2 + + + + window_command_run + window_command_run + 11 + window_command_run(index, param = 0) + 2 + -1 + + + + window_command_get_active + window_command_get_active + 11 + window_command_get_active(command) : Returns whether the given command is currently available. + 2 + 1 + + 2 + + + + window_command_set_active + window_command_set_active + 11 + window_command_set_active(command, status:bool) : Enables/disables the command. Returns -1 if not possible. + 2 + 2 + + 2 + 2 + + + + + + window_command_close + $F060 + 0 + + + window_command_maximize + $F030 + 0 + + + window_command_minimize + $F020 + 0 + + + window_command_restore + $F120 + 0 + + + window_command_winmenu + $F090 + 0 + + + window_command_resize + $F000 + 0 + + + window_command_move + $F010 + 0 + + + + + diff --git a/source.gmx/extensions/window_command_hook/window_command_hook.dll b/source.gmx/extensions/window_command_hook/window_command_hook.dll new file mode 100644 index 0000000..23687b3 Binary files /dev/null and b/source.gmx/extensions/window_command_hook/window_command_hook.dll differ diff --git a/source.gmx/extensions/window_command_hook/window_command_hook.gml b/source.gmx/extensions/window_command_hook/window_command_hook.gml new file mode 100644 index 0000000..7088418 --- /dev/null +++ b/source.gmx/extensions/window_command_hook/window_command_hook.gml @@ -0,0 +1,31 @@ +#define window_command_init +//#window_command_close = $F060: +//#window_command_maximize = $F030: +//#window_command_minimize = $F020: +//#window_command_restore = $F120: +//#window_command_resize = $F000: +//#window_command_move = $F010: + +#define window_command_hook +/// (index): Hooks the specified command +return window_command_hook_raw(window_handle(), argument0); + +#define window_command_unhook +/// (index): +return window_command_unhook_raw(window_handle(), argument0); + +#define window_command_run +/// (index, param = 0): +var wp = argument[0], lp; +if (argument_count > 1) { + lp = argument[1]; +} else lp = 0; +return window_command_run_raw(window_handle(), wp, lp); + +#define window_command_get_active +/// (command): Returns whether the given command is currently available. +return window_command_get_active_raw(window_handle(), argument0); + +#define window_command_set_active +/// (command, status:bool): Enables/disables the command. Returns -1 if not possible. +return window_command_set_active_raw(window_handle(), argument0, argument1); diff --git a/source.gmx/extensions/yymanifest.xml b/source.gmx/extensions/yymanifest.xml new file mode 100644 index 0000000..23c2138 --- /dev/null +++ b/source.gmx/extensions/yymanifest.xml @@ -0,0 +1,72 @@ + + + + N String Parser 2.extension.gmx + N String Parser 2\Assets\Scripts\nsp_arithmetic_calculate.gml + N String Parser 2\Assets\Scripts\nsp_build_grid.gml + N String Parser 2\Assets\Scripts\NSP_check_saved.gml + N String Parser 2\Assets\Scripts\nsp_combination_calculate.gml + N String Parser 2\Assets\Scripts\nsp_comparison_calculate.gml + N String Parser 2\Assets\Scripts\nsp_convert_to_list.gml + N String Parser 2\Assets\Scripts\NSP_Documentation.gml + N String Parser 2\Assets\Scripts\nsp_dsm_get.gml + N String Parser 2\Assets\Scripts\nsp_dsm_set.gml + N String Parser 2\Assets\Scripts\NSP_evaluate.gml + N String Parser 2\Assets\Scripts\nsp_evaluate_list.gml + N String Parser 2\Assets\Scripts\nsp_evaluate_long.gml + N String Parser 2\Assets\Scripts\NSP_evaluate_saved.gml + N String Parser 2\Assets\Scripts\nsp_evaluate_single.gml + N String Parser 2\Assets\Scripts\nsp_evaluate_special_word.gml + N String Parser 2\Assets\Scripts\nsp_execute_block.gml + N String Parser 2\Assets\Scripts\nsp_execute_line.gml + N String Parser 2\Assets\Scripts\nsp_execute_master.gml + N String Parser 2\Assets\Scripts\NSP_execute_saved.gml + N String Parser 2\Assets\Scripts\nsp_execute_script.gml + N String Parser 2\Assets\Scripts\nsp_execute_single.gml + N String Parser 2\Assets\Scripts\NSP_execute_string.gml + N String Parser 2\Assets\Scripts\NSP_free.gml + N String Parser 2\Assets\Scripts\NSP_free_saved.gml + N String Parser 2\Assets\Scripts\nsp_get_constant.gml + N String Parser 2\Assets\Scripts\nsp_get_token_type.gml + N String Parser 2\Assets\Scripts\nsp_gm_nom.gml + N String Parser 2\Assets\Scripts\nsp_grid_shift.gml + N String Parser 2\Assets\Scripts\NSP_initialize.gml + N String Parser 2\Assets\Scripts\nsp_is_asset.gml + N String Parser 2\Assets\Scripts\nsp_is_dsm.gml + N String Parser 2\Assets\Scripts\nsp_is_equal.gml + N String Parser 2\Assets\Scripts\nsp_is_number.gml + N String Parser 2\Assets\Scripts\nsp_is_script.gml + N String Parser 2\Assets\Scripts\nsp_is_special_word.gml + N String Parser 2\Assets\Scripts\nsp_is_string.gml + N String Parser 2\Assets\Scripts\nsp_is_variable.gml + N String Parser 2\Assets\Scripts\nsp_list_remove.gml + N String Parser 2\Assets\Scripts\nsp_list_set_types.gml + N String Parser 2\Assets\Scripts\nsp_list_tidy_and_verify.gml + N String Parser 2\Assets\Scripts\nsp_list_to_string.gml + N String Parser 2\Assets\Scripts\NSP_notify.gml + N String Parser 2\Assets\Scripts\NSP_save.gml + N String Parser 2\Assets\Scripts\nsp_src_token.gml + N String Parser 2\Assets\Scripts\nsp_statement_positions.gml + N String Parser 2\Assets\Scripts\nsp_string_crop.gml + N String Parser 2\Assets\Scripts\nsp_string_crop_ext.gml + N String Parser 2\Assets\Scripts\nsp_string_find_last.gml + N String Parser 2\Assets\Scripts\nsp_string_force.gml + N String Parser 2\Assets\Scripts\nsp_tokenize.gml + N String Parser 2\Assets\Scripts\nsp_token_is_valid.gml + N String Parser 2\Assets\Scripts\nsp_type_is_a_value.gml + N String Parser 2\Assets\Scripts\nsp_type_name.gml + N String Parser 2\Assets\Scripts\nsp_variable_get.gml + N String Parser 2\Assets\Scripts\nsp_variable_get_br.gml + N String Parser 2\Assets\Scripts\nsp_variable_get_new.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_get.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_get_br.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_get_new.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_set.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_set_br.gml + N String Parser 2\Assets\Scripts\nsp_variable_global_set_new.gml + N String Parser 2\Assets\Scripts\nsp_variable_set.gml + N String Parser 2\Assets\Scripts\nsp_variable_set_br.gml + N String Parser 2\Assets\Scripts\nsp_variable_set_new.gml + gsgj54LbpS2IPgcyxdA3jSrqyThjo8cS2iSyOGcEuSVbAZmdvYIGLfglnICCqkmiyqsVH4kHZJ5p8RLZvY8KUfHUluvGOdjIjuH06l6Y3tRDlNlF/TrswWTokOH5hI4cBw+2T3RHYHsgq5iKfPE5RaBc3ZfFQ/rHuSd19VrXiyQHlZXW2poahzDTmzcaP6EmocigRQy1+G3cAaTrf3zxK2EwmFerWOrGwIwegfxykbXKtVVZaCOYQQ3OIaq003o5EjZFNeG9YFD7MQZMh2nS1nhJEzLImnAeRKw10KtM8Y3eI4fVo34arlff6cjCa9S93+/ry0r3jB4DJei3UjLaLA== + 2D2D2D2D2D424547494E205055424C4943204B45592D2D2D2D2D0A4D494942496A414E42676B71686B6947397730424151454641414F43415138414D49494243674B4341514541776D43313443613367722F51426D7667304171640A505A387971473544314235652B67326C6371446F327746714F744C684E596362454E6C4E535649486C527A332F367234583063776F6F764F646C33695A745A470A6C4B6C724B514A764E4950612F4741484F2F785045494579794C36735955636133694172394D416F4A7258786456554D594644536859716F526472446B4969750A586D36307871714458566C5052616F67356A7350484C69417157665A38395159476F336F475A3447546D2B4F2B4C676568554C7A6B6E6257656B6437363963500A4C74674D326F69445234507735565A646951375A3630567A677465506441326A615A6F672B42303935377A5438556C7852665551526B4D56784F553050456B760A767A75364C6E594F304B7854344F692B68702F46665737645951304C777131615750317A6B706841556649433274424E68385446563374436D4F3543454B34350A57514944415141420A2D2D2D2D2D454E44205055424C4943204B45592D2D2D2D2D0A + diff --git a/source.gmx/objects/oApple.object.gmx b/source.gmx/objects/oApple.object.gmx index 2d65be6..fa83856 100644 --- a/source.gmx/objects/oApple.object.gmx +++ b/source.gmx/objects/oApple.object.gmx @@ -25,9 +25,9 @@ 1 - event_inherited() + event_inherited(); image_speed=0 -codable_create() +codable_create(); diff --git a/source.gmx/objects/oApple.object.gmx.bak b/source.gmx/objects/oApple.object.gmx.bak new file mode 100644 index 0000000..6fa0a8b --- /dev/null +++ b/source.gmx/objects/oApple.object.gmx.bak @@ -0,0 +1,100 @@ + + + sApple + 0 + -1 + 0 + 0 + oKiller + sAppleDefault + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + event_inherited() +image_speed=0 + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + event_inherited() +if global.paused=false and global.recordingpaused=false{ +image_index = floor(global.count/15) mod 2 +<<<<<<< HEAD:jtool.gmx/objects/oApple.object.gmx +======= +codable_step()} +>>>>>>> upstream/master:source.gmx/objects/oApple.object.gmx + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + event_inherited() + + + + + + + 0 + 0 + 0 + 0.5 + 0.100000001490116 + 0 + 0.100000001490116 + 0.100000001490116 + 0.200000002980232 + -1 + 0 + + diff --git a/source.gmx/objects/oEdit.object.gmx b/source.gmx/objects/oEdit.object.gmx index 635d1d8..00c7ee0 100644 --- a/source.gmx/objects/oEdit.object.gmx +++ b/source.gmx/objects/oEdit.object.gmx @@ -141,7 +141,7 @@ if( shouldCaptureControls ) { } } } - //code editor + // code editor else if alt and not instance_exists(oInputOverlay) { draggedInstance = noone; cursor_sprite = sCursorCoder @@ -216,8 +216,7 @@ if( shouldCaptureControls ) { if (place_meeting(x,y,oEdit) or collision_line(other.xprevious, other.yprevious, other.x, other.y,id,true,false)) - and object_index != oPlayerStart - and !codable_is_dynamic(id) { + and object_index != oPlayerStart { var undoStr = createStringFromInstance( self ); with( oEdit ) { expandUndoEvent( undoStr ); } instance_destroy() diff --git a/source.gmx/objects/oEditBlock.object.gmx b/source.gmx/objects/oEditBlock.object.gmx index 003630b..55de23a 100644 --- a/source.gmx/objects/oEditBlock.object.gmx +++ b/source.gmx/objects/oEditBlock.object.gmx @@ -25,7 +25,8 @@ 1 - codable_create() + event_inherited(); +codable_create(); @@ -48,7 +49,7 @@ 1 - codable_step() + codable_step(); @@ -71,7 +72,7 @@ 1 - codable_draw(true) + codable_draw(true); diff --git a/source.gmx/objects/oEditMiniBlock.object.gmx b/source.gmx/objects/oEditMiniBlock.object.gmx index cc5e33c..e90503d 100644 --- a/source.gmx/objects/oEditMiniBlock.object.gmx +++ b/source.gmx/objects/oEditMiniBlock.object.gmx @@ -7,77 +7,7 @@ 0 oBlock sEditMiniBlockDefault - - - - 1 - 603 - 7 - 0 - 0 - -1 - 2 - - - self - 0 - 0 - - - 1 - codable_create() - - - - - - - - 1 - 603 - 7 - 0 - 0 - -1 - 2 - - - self - 0 - 0 - - - 1 - codable_step() - - - - - - - - 1 - 603 - 7 - 0 - 0 - -1 - 2 - - - self - 0 - 0 - - - 1 - codable_draw(true) - - - - - - + 0 0 0 diff --git a/source.gmx/objects/oMenu.object.gmx b/source.gmx/objects/oMenu.object.gmx index 0e68030..eb138db 100644 --- a/source.gmx/objects/oMenu.object.gmx +++ b/source.gmx/objects/oMenu.object.gmx @@ -194,16 +194,6 @@ if menuButton(xx,yy,w,h,'Export RMJ Map',buttons_enabled,false) { } else saveRMJMap() } -//save REC -yy += dy -if global.paused = false and menuButton(xx,yy,w,h,'Save Record',buttons_enabled,false) { - saveRecordAskName() -} -//load REC -yy += dy -if global.paused = false and menuButton(xx,yy,w,h,'Load Record',buttons_enabled,false) { - loadRecordAskName() -} xx += dx+dx2 yy = y+yo diff --git a/source.gmx/objects/oMenu.object.gmx.bak b/source.gmx/objects/oMenu.object.gmx.bak new file mode 100644 index 0000000..a15b2a1 --- /dev/null +++ b/source.gmx/objects/oMenu.object.gmx.bak @@ -0,0 +1,501 @@ + + + sEditorMenu + 0 + -1 + -150 + 0 + <undefined> + <undefined> + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + menu_height = 290//200 +x = 0 +y = -menu_height +steps_in_menu = 0 +steps_out_of_menu = 0 +yspeed = 0 +escape_button_just_clicked = false + +global.stopX = -1 + global.stopY = 0 + global.stopgrav = 0 + global.stopplayer_xscale = 0 + +Background = sprite_add("Screenie.png", 0, false, true, 0, 0); + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + continueRecordBegin() + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + steps_out_of_menu += 1 +if (keyboard_check_pressed(vk_escape) or escape_button_just_clicked) +and global.state == globalstate_menu +and steps_in_menu > 0 { + global.state = globalstate_idle + steps_out_of_menu = 0 + restoreZoom() +} + +if global.state == globalstate_menu { + var dy = (0-y)*0.25 + if dy > 1 y = floor(y + dy) + steps_in_menu += 1 +} +else if global.state == globalstate_idle { + y += (-(menu_height+40)-y)*0.1 + if y < -menu_height y = -menu_height + steps_in_menu = -1 +} + +escape_button_just_clicked = false + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + other + 0 + 0 + + + 1 + draw_sprite(sMenu,0,0,y-(sprite_get_height(sMenu)-menu_height)) + +var buttons_enabled = global.state == globalstate_menu and steps_in_menu > 0 +var w = 130 +var h = 32 +var dx = 140 +var dy = 40 +var dx2 = 40 +var xo = 20 +var yo = 50 + +var xx = x+xo +var yy = y+yo +menuSection(xx,yy,'File',false) + +// open map +var clicked = menuButton(xx,yy,w,h,'Open Map',buttons_enabled,sMenuOpen) +var shortcut = keyboard_check(vk_control) and keyboard_check_pressed(ord('O')) +if clicked or shortcut { + if not oEdit.undo_nochanges { + inputOverlay(input_yesno,inputCallback_LoadMap, + 'Map has been modified. Save changes?') + } + else { + global.input_bool = false + global.input_cancel = false + inputCallback_LoadMap() + } +} + +// save map +yy += dy +var clicked = menuButton(xx,yy,w,h,'Save Map',buttons_enabled,sMenuSave) +var shortcut = keyboard_check(vk_control) and keyboard_check_pressed(ord('S')) +if clicked or shortcut { + if window_get_fullscreen() { + window_set_fullscreen(false) + oWorld.alarm[0] = 1 + oWorld.alarm[1] = 2 + } + else saveMap() +} + +// open RMJ +yy += dy +if menuButton(xx,yy,w,h,'Import RMJ Map',buttons_enabled,false) { + if not oEdit.undo_nochanges { + inputOverlay(input_yesno,inputCallback_LoadRMJMap, + 'Map has been modified. Save changes?') + } + else { + global.input_bool = false + global.input_cancel = false + inputCallback_LoadRMJMap() + } +} + +//save RMJ +yy += dy +if menuButton(xx,yy,w,h,'Export RMJ Map',buttons_enabled,false) { + if window_get_fullscreen() { + window_set_fullscreen(false) + oWorld.alarm[0] = 1 + oWorld.alarm[4] = 2 + } + else saveRMJMap() +} +//save REC +yy += dy +if global.paused = false and menuButton(xx,yy,w,h,'Save Record',buttons_enabled,false) { + saveRecordAskName() +} +//load REC +yy += dy +if global.paused = false and menuButton(xx,yy,w,h,'Load Record',buttons_enabled,false) { + loadRecordAskName() +} + +xx += dx+dx2 +yy = y+yo +menuSection(xx,yy,'Map',true) + +// dotkid +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuDotkid, +'[ Dotkid ]','Dotkid',global.dotkid) { + global.dotkid = not global.dotkid +} + +// save type +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuSavePoint, +'Z Saves','Shoot Saves',global.savetype) { + global.savetype = not global.savetype + saveConfig() +} + +// inf jump +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuInfJump, +'[ Inf Jump ]','Inf Jump',global.infinitejump) { + global.infinitejump = not global.infinitejump + if global.infinitejump oJumpManyTimes.image_alpha = 2 +} + +// border type +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuBorderType, +'Solid Border','Death Border',global.bordertype) { + global.bordertype = not global.bordertype +} + +xx += dx+dx2 +yy = y+yo +menuSection(xx,yy,'Preferences',true) + +// death enabled +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuDeath, +'[ Death ]','Death',global.deathEnabled) { + global.deathEnabled = not global.deathEnabled + saveConfig() +} + +// grid draw +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuGrid, +'Grid: '+string(global.grid_draw),'Grid: off',global.grid_draw != 0) { + switch global.grid_draw { + case 0: global.grid_draw = 32 break + case 32: global.grid_draw = 16 break + case 16: global.grid_draw = 8 break + case 8: global.grid_draw = 4 break + case 4: global.grid_draw = 2 break + case 2: global.grid_draw = 0 break + default: global.grid_draw = 0 break + } + oDrawGrid.needToRedrawSurf = true + saveConfig() +} + +// show hitbox +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuHitbox, +'[ Hitbox ]','Hitbox',global.showhitbox) { + global.showhitbox += 1 + if global.showhitbox > 2 global.showhitbox = 0 + saveConfig() +} + +// outline +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuDotOutline, +'[ Dot Outline ]','Dot Outline',global.dotkidoutline) { + global.dotkidoutline = not global.dotkidoutline + saveConfig() +} + +// start record +yy += dy +if menuButton(xx,yy,w,h,'Record',buttons_enabled,sMenuRecord) { + global.PlayerFrameCounter = 0 + startRecord(); + escape_button_just_clicked = true; +} + +//continue record +yy +=dy +if menuButton(xx,yy,w,h,'Continue',buttons_enabled,sMenuContinue) { + escape_button_just_clicked = true; + if global.paused = false { + continueRecordAskName() } +} + + +// change skin +xx += dx +yy = y+yo +var m = menuButtonTwoPart(xx,yy,w,h,'Change Skin',buttons_enabled,sMenuSkin) +if m != 0 { + cycleSkin((m-1)*2-1) +} + +// toggle mouse coords +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuCoords, +'[ Coordinates ]','Coordinates',global.mousecoords) { + global.mousecoords = not global.mousecoords + saveConfig() +} + +// fullscreen +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sMenuFullscreen,'[ Fullscreen ]','Fullscreen',window_get_fullscreen()) +or (keyboard_check_pressed(vk_f4) and not keyboard_check_direct(vk_alt)) { + window_set_fullscreen(not window_get_fullscreen()) + oWorld.alarm[0]=1 + completelyResetZoom() + saveConfig() +} + +// hide sidebar +yy += dy +var sidebar_spr = sMenuSidebar +if global.hidesidebar sidebar_spr = sMenuSidebar2 +if menuButtonToggle(xx,yy,w,h,buttons_enabled,sidebar_spr, +'Show Sidebar','Hide Sidebar',global.hidesidebar) { + global.hidesidebar = not global.hidesidebar + saveConfig() +} + +// stop record +yy += dy +if menuButton(xx,yy,w,h,'Stop',buttons_enabled,sMenuStop) { + global.savecount = 0 + global.SavedPlayerFrameCounter = global.PlayerFrameCounter + if instance_exists(oPlayer) { + global.stopX = oPlayer.x + global.stopY = oPlayer.y + global.stopgrav = global.recordGrav + global.stopplayer_xscale = global.player_xscale + global.stopVspeed = oPlayer.vspeed + global.stopDjump = oPlayer.djump } + else if global.paused { + + global.stopX = global.pausedX + global.stopY = global.pausedY + global.stopgrav = global.pausedgrav + global.stopplayer_xscale = global.pausedplayer_xscale + global.stopVspeed = global.pausedVspeed + global.stopDjump = global.pausedDjump } + + playRecord(); + escape_button_just_clicked = true; +} + + +// depth +xx += dx +yy = y+yo +if menuButton(xx,yy,w,h,'Depth Order',buttons_enabled,sMenuDepth) { + inputOverlay(input_depth, false, '') +} + +// water lock +yy += dy +var waterlock_spr = sMenuWaterLock2 +if global.waterlocked waterlock_spr = sMenuWaterLock +if menuButtonToggle(xx,yy,w,h,buttons_enabled,waterlock_spr,'[ Lock Water ]','Lock Water',global.waterlocked) { + global.waterlocked = not global.waterlocked +} + +// clear map +yy += dy +if (menuButton(xx,yy,w,h,'Clear Map (F2)',buttons_enabled,sMenuClearMap) +or keyboard_check_pressed(vk_f2)) and global.paused=false { + if not oEdit.undo_nochanges { + inputOverlay(input_yesno,inputCallback_ClearMap, + 'Map has been modified. Save changes?') + } + else { + global.input_bool = false + global.input_cancel = false + inputCallback_ClearMap() + } +} + +// toggle backups +yy += dy +if menuButtonToggle(xx,yy,w,h,buttons_enabled,0,'Backups on','Backups off',global.backup) { + global.backup = not global.backup + saveConfig() +} + +<<<<<<< HEAD:jtool.gmx/objects/oMenu.object.gmx +// change death animation +======= +yy += dy +if menuButton(xx,yy,w,h,'Eraser',buttons_enabled,sMenuEraser) { + eraserRecord(); + global.record = 0 + global.FrameCounterOn = false + global.PlayerFrameCounter = 0 +} + +// toggle update check +>>>>>>> upstream/master:source.gmx/objects/oMenu.object.gmx +xx += dx +yy = y+yo +var m = menuButtonTwoPart(xx,yy,w-16,h,'Death Anim',buttons_enabled,sMenuDeathAnim) +if m != 0 { + if (instance_exists(oPlayer)) + cycleDeathAnim((m-1)*2-1) + else + inputOverlay(input_info,false,'Warning: You cannot change the death animation while dead!') +} + +// toggle update check +yy += dy*2 +if menuButtonToggle(xx,yy,w,h,buttons_enabled,0,'Update check on','Update check off',global.checkupdates) { + global.checkupdates = not global.checkupdates + saveConfig() +} + +// shift all objects +var sw = 18; +var sh = 18; +var sdy = 12; +var sdx = 25; +yy -= dy-6 + +xx += sdx*2 +if menuButtonShift(xx, yy, sw, sh, '>', buttons_enabled, 0) { + with( oEdit ) { clearUndoStack(); } + with all if objectInPalette(object_index) x += oEdit.snap; +} +xx -= sdx +yy += sdy +if menuButtonShift(xx, yy, sw, sh, 'v', buttons_enabled, 0) { + with( oEdit ) { clearUndoStack(); } + with all if objectInPalette(object_index) y += oEdit.snap +} +yy -= sdy*2 +if menuButtonShift(xx, yy, sw, sh, '^', buttons_enabled, 0) { + with( oEdit ) { clearUndoStack(); } + with all if objectInPalette(object_index) y -= oEdit.snap +} +xx -= sdx +yy += sdy +if menuButtonShift(xx, yy, sw, sh, '<', buttons_enabled, 0) { + with( oEdit ) { clearUndoStack(); } + with all if objectInPalette(object_index) x -= oEdit.snap +} + +// close menu +xx = 1056-w-8 +yy = y+12 +if menuButton(xx,yy,w,h,'Close Menu (Esc)',buttons_enabled,false) +or (buttons_enabled and mouse_y > y+menu_height and mouse_check_button_pressed(mb_left)) { + escape_button_just_clicked = true +} + +// about +yy += dy +if menuButton(xx,yy,w,h,'About',buttons_enabled,false) { + inputOverlay(input_about,false,'') +} + +// game end +yy += dy +if menuButton(xx,yy,w,h,'Quit',buttons_enabled,false) { + exitPressed() +} + + + + + + + + + 0 + 0 + 0 + 0.5 + 0.100000001490116 + 0 + 0.100000001490116 + 0.100000001490116 + 0.200000002980232 + -1 + 0 + + diff --git a/source.gmx/objects/oMiniSpikeDown.object.gmx b/source.gmx/objects/oMiniSpikeDown.object.gmx index 362aaf5..47cb571 100644 --- a/source.gmx/objects/oMiniSpikeDown.object.gmx +++ b/source.gmx/objects/oMiniSpikeDown.object.gmx @@ -25,8 +25,8 @@ 1 - event_inherited() -codable_create() + event_inherited(); +codable_create(); @@ -49,7 +49,7 @@ codable_create() 1 - codable_step() + codable_step(); @@ -72,8 +72,8 @@ codable_create() 1 - event_inherited() -codable_draw(false) + event_inherited(); +codable_draw(false); diff --git a/source.gmx/objects/oMiniSpikeLeft.object.gmx b/source.gmx/objects/oMiniSpikeLeft.object.gmx index 314c9a3..7700246 100644 --- a/source.gmx/objects/oMiniSpikeLeft.object.gmx +++ b/source.gmx/objects/oMiniSpikeLeft.object.gmx @@ -25,8 +25,8 @@ 1 - event_inherited() -codable_create() + event_inherited(); +codable_create(); @@ -49,7 +49,7 @@ codable_create() 1 - codable_step() + codable_step(); @@ -72,8 +72,8 @@ codable_create() 1 - event_inherited() -codable_draw(false) + event_inherited(); +codable_draw(false); diff --git a/source.gmx/objects/oMiniSpikeRight.object.gmx b/source.gmx/objects/oMiniSpikeRight.object.gmx index b5e7fcb..075d67f 100644 --- a/source.gmx/objects/oMiniSpikeRight.object.gmx +++ b/source.gmx/objects/oMiniSpikeRight.object.gmx @@ -25,8 +25,8 @@ 1 - event_inherited() -codable_create() + event_inherited(); +codable_create(); @@ -49,7 +49,7 @@ codable_create() 1 - codable_step() + codable_step(); @@ -72,8 +72,8 @@ codable_create() 1 - event_inherited() -codable_draw(false) + event_inherited(); +codable_draw(false); diff --git a/source.gmx/objects/oMiniSpikeUp.object.gmx b/source.gmx/objects/oMiniSpikeUp.object.gmx index b2247ff..7e0265e 100644 --- a/source.gmx/objects/oMiniSpikeUp.object.gmx +++ b/source.gmx/objects/oMiniSpikeUp.object.gmx @@ -25,8 +25,8 @@ 1 - event_inherited() -codable_create() + event_inherited(); +codable_create(); @@ -49,7 +49,7 @@ codable_create() 1 - codable_step() + codable_step(); @@ -72,8 +72,8 @@ codable_create() 1 - event_inherited() -codable_draw(false) + event_inherited(); +codable_draw(false); diff --git a/source.gmx/objects/oPalette.object.gmx.bak b/source.gmx/objects/oPalette.object.gmx.bak new file mode 100644 index 0000000..faf98e8 --- /dev/null +++ b/source.gmx/objects/oPalette.object.gmx.bak @@ -0,0 +1,567 @@ + + + sEditorPalette + 0 + -1 + -120 + 0 + <undefined> + <undefined> + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + combobox_selected = false + +/* + xx - x coordinate of the button location + yy - y coordinate of the button location + spr - sprite to draw + obj - object to select if clicked + off - offset to draw sprite at if origin is not centered + killer - whether or not to draw the object with the killer tint +*/ + +buttonCount = 0; +xxs[buttonCount]=0 yys[buttonCount]=0 sprs[buttonCount]=sSpikeUp objs[buttonCount]=oSpikeUp offs[buttonCount]=16 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=1 yys[buttonCount]=0 sprs[buttonCount]=sSpikeDown objs[buttonCount]=oSpikeDown offs[buttonCount]=16 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=2 yys[buttonCount]=0 sprs[buttonCount]=sSpikeLeft objs[buttonCount]=oSpikeLeft offs[buttonCount]=16 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=3 yys[buttonCount]=0 sprs[buttonCount]=sSpikeRight objs[buttonCount]=oSpikeRight offs[buttonCount]=16 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=0 yys[buttonCount]=1 sprs[buttonCount]=sMiniSpikeUp objs[buttonCount]=oMiniSpikeUp offs[buttonCount]=8 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=1 yys[buttonCount]=1 sprs[buttonCount]=sMiniSpikeDown objs[buttonCount]=oMiniSpikeDown offs[buttonCount]=8 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=2 yys[buttonCount]=1 sprs[buttonCount]=sMiniSpikeLeft objs[buttonCount]=oMiniSpikeLeft offs[buttonCount]=8 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=3 yys[buttonCount]=1 sprs[buttonCount]=sMiniSpikeRight objs[buttonCount]=oMiniSpikeRight offs[buttonCount]=8 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=0 yys[buttonCount]=2 sprs[buttonCount]=sEditBlock objs[buttonCount]=oEditBlock offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=1 yys[buttonCount]=2 sprs[buttonCount]=sEditMiniBlock objs[buttonCount]=oEditMiniBlock offs[buttonCount]=8 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=2 yys[buttonCount]=2 sprs[buttonCount]=sPlatform objs[buttonCount]=oPlatform offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=3 yys[buttonCount]=2 sprs[buttonCount]=sApple objs[buttonCount]=oApple offs[buttonCount] = 0 killers[buttonCount]=true tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=0 yys[buttonCount]=3 sprs[buttonCount]=sWater2 objs[buttonCount]=oWater2 offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount]='Water 2'; +buttonCount++; +xxs[buttonCount]=1 yys[buttonCount]=3 sprs[buttonCount]=sWater3 objs[buttonCount]=oWater3 offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount]='Water 3'; +buttonCount++; +xxs[buttonCount]=2 yys[buttonCount]=3 sprs[buttonCount]=sWalljumpR objs[buttonCount]=oWalljumpR offs[buttonCount] = 16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=3 yys[buttonCount]=3 sprs[buttonCount]=sWalljumpL objs[buttonCount]=oWalljumpL offs[buttonCount] = 16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=0 yys[buttonCount]=4 sprs[buttonCount]=sJumpRefresher objs[buttonCount]=oJumpRefresher offs[buttonCount]=0 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=1 yys[buttonCount]=4 sprs[buttonCount]=sSave objs[buttonCount]=oSave offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=2 yys[buttonCount]=4 sprs[buttonCount]=sPlayerStart objs[buttonCount]=oPlayerStart offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=3 yys[buttonCount]=4 sprs[buttonCount]=sEllipsis objs[buttonCount]=noone offs[buttonCount]=0 killers[buttonCount]=false tooltips[buttonCount]='More objects' +buttonCount++; +xxs[buttonCount]=0 yys[buttonCount]=5 sprs[buttonCount]=sWarp objs[buttonCount]=oWarp offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount]='Goal'; +buttonCount++; +xxs[buttonCount]=1 yys[buttonCount]=5 sprs[buttonCount]=sKillerBlock objs[buttonCount]=oKillerBlock offs[buttonCount]=16 killers[buttonCount]=true tooltips[buttonCount]='Killer block'; +buttonCount++; +xxs[buttonCount]=2 yys[buttonCount]=5 sprs[buttonCount]=sWater1 objs[buttonCount]=oWater offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount]='Water 1'; +buttonCount++; +xxs[buttonCount]=3 yys[buttonCount]=5 sprs[buttonCount]=sBulletBlocker objs[buttonCount]=oBulletBlocker offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount]='Bullet blocker'; +buttonCount++; +xxs[buttonCount]=0 yys[buttonCount]=6 sprs[buttonCount]=sGravityArrowUp objs[buttonCount]=oGravityArrowUp offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=1 yys[buttonCount]=6 sprs[buttonCount]=sGravityArrowDown objs[buttonCount]=oGravityArrowDown offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=2 yys[buttonCount]=6 sprs[buttonCount]=sSaveFlip objs[buttonCount]=oSaveFlip offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +<<<<<<< HEAD:jtool.gmx/objects/oPalette.object.gmx +======= +xxs[buttonCount]=3 yys[buttonCount]=6 sprs[buttonCount]=sPink32 objs[buttonCount]=oTrg offs[buttonCount]=16 killers[buttonCount]=false tooltips[buttonCount] = ''; +buttonCount++; +xxs[buttonCount]=0 yys[buttonCount]=7 sprs[buttonCount]=sMiniKillerBlock objs[buttonCount]=oMiniKillerBlock offs[buttonCount]=0 killers[buttonCount]=true tooltips[buttonCount]='Mini killer block'; +buttonCount++; + + +>>>>>>> upstream/master:source.gmx/objects/oPalette.object.gmx + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if global.hidesidebar exit + +if combobox_selected and global.state != globalstate_idle { + combobox_selected = false + global.comboboxselected = false +} + +var xo = 0 +var w = 50 +dx = w+8 + +var yo = 0 +var h = 50 +dy = h+8 +var tooltip_to_draw = '' + +for (i = 0; i < buttonCount; i += 1) { + /* + xx - x coordinate of the button location + yy - y coordinate of the button location + spr - sprite to draw + obj - object to select if clicked + off - offset to draw sprite at if origin is not centered + killer - whether or not to draw the object with the killer tint + */ + + var xx = xxs[i]; + var yy = yys[i]; + var spr = sprs[i]; + var obj = objs[i]; + var off = offs[i]; + var killer = killers[i]; + var tooltip = tooltips[i]; + + var in_combobox = yy == 5 or yy == 6 or yy==7 + if in_combobox and not combobox_selected continue + + // draw button backing and sprite + var xxx = x+xo+xx*dx + var yyy = y+yo+yy*dy + drawButton(xxx,yyy,w,h,false) + + var color = c_white + if killer color = global.color_killer + + var spike = obj == oSpikeUp or obj == oSpikeRight or obj == oSpikeLeft or obj == oSpikeDown + var minispike = obj == oMiniSpikeUp or obj == oMiniSpikeRight or obj == oMiniSpikeLeft or obj == oMiniSpikeDown + var frame = 0 + if spike frame = floor((global.count mod (global.spikeframes/global.spikeanimspeed))*global.spikeanimspeed) + if minispike frame = floor((global.count mod (global.minispikeframes/global.minispikeanimspeed))*global.minispikeanimspeed) + + draw_sprite_ext(spr,frame,xxx+w/2-off,yyy+h/2-off,1,1,0,color,1) + + // draw highlight and set tooltip + var button_highlighted = point_in_rect(mouse_x,mouse_y,xxx,yyy,xxx+w,yyy+h) + and (not global.comboboxselected or in_combobox) + and global.state == globalstate_idle + + if button_highlighted { + draw_set_alpha(global.buttonhoveralpha) + draw_set_color(global.color_buttonhover) + draw_rectangle(xxx+1,yyy+1,xxx+w-2,yyy+h-2,false) + if global.buttonhoverborder { + draw_set_alpha(0.3) + draw_set_color(c_black) + draw_rectangle(xxx-1,yyy-1,xxx+w,yyy+h,true) + } + if tooltip != '' { + tooltip_to_draw = tooltip + } + } + + // pressing button + var is_comboboxtoggle = xx == 3 and yy == 4 + if button_highlighted and mouse_check_button_pressed(mb_left) { + if not is_comboboxtoggle { + oEdit.selected_object = obj + oEdit.selected_sprite = spr + oEdit.selected_killer = killer + if in_combobox { + combobox_selected = false + global.comboboxselected = false + } + } + else { + combobox_selected = not combobox_selected + global.comboboxselected = combobox_selected + } + var flash = instance_create(xxx,yyy,oPaletteButtonFlash); + flash.w = w + flash.h = h + } + + // draw combo box back and detect mouse leave + if is_comboboxtoggle and combobox_selected { + var combo_x = x+xo-8 + var combo_y = y+yo+5*dy-9 + var combo_w = dx*4+8 + var combo_h = dy*3+9 + + drawButton(combo_x,combo_y,combo_w,combo_h,false) + drawButton(xxx,yyy,w,combo_y-yyy+1,false) + draw_set_color(global.color_button) + draw_line(xxx,combo_y,xxx+w-2,combo_y) + + if not point_in_rect(mouse_x,mouse_y,combo_x,yyy,combo_x+combo_w,combo_y+combo_h) { + combobox_selected = false + global.comboboxselected = false + } + } +} + +if tooltip_to_draw != '' { + draw_set_font(font_small) + var w = string_width(tooltip_to_draw)+10 + var xx = min(mouse_x, room_width-5-w) + menuButton(xx, mouse_y+20, w, 25, tooltip_to_draw, false, false) +} + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + +selectEditObject( 16 ); + +} + + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + +if( oEdit.selected_object == oWalljumpR ) { + with( oEdit ) { selectNextObject(); } +} else { + selectEditObject( 14 ); +} + +} + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + +var o = oEdit.selected_object; +if( o == oWater || o == oWater2 || o == oWater3 ) { + with( oEdit ) { selectNextObject(); } +} else { + selectEditObject( 12 ); +} + +} + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + + if( oEdit.selected_object == oApple ) { + with( oEdit ) { selectNextObject(); } + } else { + selectEditObject( 11 ); + } + +} + + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + selectEditObject( 10 ); +} + + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + +if( oEdit.selected_object == oSave ) { + with( oEdit ) { selectNextObject(); } +} else { + selectEditObject( 17 ); +} + +} + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + +var o = oEdit.selected_object; +if( o == oMiniSpikeLeft || o == oMiniSpikeUp || o == oMiniSpikeRight || o == oMiniSpikeDown ) { + with( oEdit ) { selectNextObject(); } +} else { + selectEditObject( 4 ); +} + +} + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + +var o = oEdit.selected_object; +if( o == oSpikeLeft || o == oSpikeUp || o == oSpikeRight || o == oSpikeDown ) { + with( oEdit ) { selectNextObject(); } +} else { + selectEditObject( 0 ); +} + +} + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + +if( oEdit.selected_object == oEditBlock ) { + with( oEdit ) { selectNextObject(); } +} else { + selectEditObject( 8 ); +} + +} + + + + + + + + 1 + 603 + 7 + 0 + 0 + -1 + 2 + + + self + 0 + 0 + + + 1 + if( global.state == globalstate_idle ) { + + if( oEdit.selected_object == oPlayerStart ) { + with( oEdit ) { selectNextObject(); } + } else { + selectEditObject( 18 ); + } + +} + + + + + + + 0 + 0 + 0 + 0.5 + 0.100000001490116 + 0 + 0.100000001490116 + 0.100000001490116 + 0.200000002980232 + -1 + 0 + + diff --git a/source.gmx/objects/oPlatform.object.gmx b/source.gmx/objects/oPlatform.object.gmx index 2d7fb68..baee313 100644 --- a/source.gmx/objects/oPlatform.object.gmx +++ b/source.gmx/objects/oPlatform.object.gmx @@ -27,8 +27,6 @@ 1 yspeed = 0 bounce = false - -codable_create() @@ -94,31 +92,6 @@ codable_create() yspeed = 0 } } - -codable_step() - - - - - - - - 1 - 603 - 7 - 0 - 0 - -1 - 2 - - - other - 0 - 0 - - - 1 - codable_draw(true) diff --git a/source.gmx/objects/oPlayerBlood.object.gmx b/source.gmx/objects/oPlayerBlood.object.gmx index 26ebb09..41b9c69 100644 --- a/source.gmx/objects/oPlayerBlood.object.gmx +++ b/source.gmx/objects/oPlayerBlood.object.gmx @@ -25,14 +25,14 @@ 1 - image_index = choose(0,1,2) -image_speed = 0 -gravity = (0.1+random(0.2)) * global.grav -direction = random(360)//irandom(35)*10 -speed = random(6) + image_index = choose(0,1,2); +image_speed = 0; +gravity = (0.1+random(0.2)) * global.grav; +direction = random(360); //irandom(35)*10 +speed = random(6); -image_xscale=1.5 -image_yscale=image_xscale +image_xscale = 1.5; +image_yscale = image_xscale; @@ -88,27 +88,20 @@ gravity = 0 - + 1 - 603 - 7 + 203 + 0 0 0 -1 - 2 - + 1 + action_kill_object self 0 0 - - - 1 - /// do nothing - - - diff --git a/source.gmx/objects/oSpikeDown.object.gmx b/source.gmx/objects/oSpikeDown.object.gmx index 391636c..a3b6a24 100644 --- a/source.gmx/objects/oSpikeDown.object.gmx +++ b/source.gmx/objects/oSpikeDown.object.gmx @@ -25,8 +25,8 @@ 1 - event_inherited() -codable_create() + event_inherited(); +codable_create(); @@ -49,7 +49,7 @@ codable_create() 1 - codable_step() + codable_step(); @@ -72,8 +72,8 @@ codable_create() 1 - event_inherited() -codable_draw(false) + event_inherited(); +codable_draw(false); diff --git a/source.gmx/objects/oSpikeLeft.object.gmx b/source.gmx/objects/oSpikeLeft.object.gmx index ade8fd7..87b407b 100644 --- a/source.gmx/objects/oSpikeLeft.object.gmx +++ b/source.gmx/objects/oSpikeLeft.object.gmx @@ -25,8 +25,8 @@ 1 - event_inherited() -codable_create() + event_inherited(); +codable_create(); @@ -49,7 +49,7 @@ codable_create() 1 - codable_step() + codable_step(); @@ -72,8 +72,8 @@ codable_create() 1 - event_inherited() -codable_draw(false) + event_inherited(); +codable_draw(false); diff --git a/source.gmx/objects/oSpikeRight.object.gmx b/source.gmx/objects/oSpikeRight.object.gmx index d5534b1..a7fa077 100644 --- a/source.gmx/objects/oSpikeRight.object.gmx +++ b/source.gmx/objects/oSpikeRight.object.gmx @@ -25,8 +25,8 @@ 1 - event_inherited() -codable_create() + event_inherited(); +codable_create(); @@ -49,7 +49,7 @@ codable_create() 1 - codable_step() + codable_step(); @@ -72,8 +72,8 @@ codable_create() 1 - event_inherited() -codable_draw(false) + event_inherited(); +codable_draw(false); diff --git a/source.gmx/objects/oSpikeUp.object.gmx b/source.gmx/objects/oSpikeUp.object.gmx index 7e8878f..fa327a0 100644 --- a/source.gmx/objects/oSpikeUp.object.gmx +++ b/source.gmx/objects/oSpikeUp.object.gmx @@ -25,8 +25,8 @@ 1 - event_inherited() -codable_create() + event_inherited(); +codable_create(); @@ -49,7 +49,7 @@ codable_create() 1 - codable_step() + codable_step(); @@ -72,8 +72,8 @@ codable_create() 1 - event_inherited() -codable_draw(false) + event_inherited(); +codable_draw(false); diff --git a/source.gmx/objects/oTrg.object.gmx b/source.gmx/objects/oTrg.object.gmx index cf2f74f..72045ba 100644 --- a/source.gmx/objects/oTrg.object.gmx +++ b/source.gmx/objects/oTrg.object.gmx @@ -25,7 +25,8 @@ 1 - codable_create() + event_inherited(); +codable_create(); @@ -48,7 +49,7 @@ 1 - codable_step() + codable_step(); @@ -71,7 +72,7 @@ 1 - codable_draw(true) + codable_draw(true); diff --git a/source.gmx/objects/oWorld.object.gmx b/source.gmx/objects/oWorld.object.gmx index 211ec81..8bb6160 100644 --- a/source.gmx/objects/oWorld.object.gmx +++ b/source.gmx/objects/oWorld.object.gmx @@ -25,7 +25,7 @@ 1 - mainInit() + mainInit(); @@ -222,7 +222,6 @@ if global.paused = false and keyboard_check_pressed(global.key_restart) { with oJumpRefresher count = 0 with oKiller highlight_count = 1000 with oWarp highlight_count = 1000 - codable_room_restart() } if keyboard_check_direct(vk_alt) and keyboard_check_pressed(vk_f4) { @@ -285,8 +284,16 @@ global.count += 1 1 - if (ex_patch_window_close_event()) { - exitPressed() + if (os_type == os_windows) +{ + if (window_command_check(window_command_close)) + { + exitPressed(); + } +} +else +{ + game_end(); } diff --git a/source.gmx/rooms/rm_sample_ex_patch_windowclose.room.gmx b/source.gmx/rooms/rm_sample_ex_patch_windowclose.room.gmx deleted file mode 100644 index 6b18053..0000000 --- a/source.gmx/rooms/rm_sample_ex_patch_windowclose.room.gmx +++ /dev/null @@ -1,63 +0,0 @@ - - - - 1024 - 768 - 32 - 32 - 0 - 30 - 0 - 5131854 - -1 - - 0 - -1 - -1 - - -1 - 1004 - 600 - -1 - -1 - -1 - -1 - -1 - 0 - 0 - -1 - 1 - -87 - -42 - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - 0 - 1024 - 768 - 0 - 10 - 0.100000001490116 - diff --git a/source.gmx/scripts/FSIniReadReal.gml b/source.gmx/scripts/FSIniReadReal.gml index dd5ac45..9c098ec 100644 --- a/source.gmx/scripts/FSIniReadReal.gml +++ b/source.gmx/scripts/FSIniReadReal.gml @@ -2,5 +2,7 @@ var section = argument0; var key = argument1; var def = argument2; -var resultStr = FS_ini_read_string( section, key, string( def ) ); -return real( resultStr ); +//var resultStr = ini_read_string( section, key, string( def ) ); +//return real( resultStr ); + +return ini_read_real(section, key, def); diff --git a/source.gmx/scripts/NSP_Documentation.gml b/source.gmx/scripts/NSP_Documentation.gml index 91dbd10..65c95c5 100644 --- a/source.gmx/scripts/NSP_Documentation.gml +++ b/source.gmx/scripts/NSP_Documentation.gml @@ -1,29 +1,9 @@ /* N STRING PARSER - DOCUMENTATION: - v2.4.9 + v2.6.6 By Surgeon_. You can send me a PM on GMC if you have any questions, bug reports and/or suggestions. Credit would be nice if you use it. ->>LICENSE: - -Copyright 2015 Jovan Batnožiæ - - -N String Parser v2.4.9 is free software: you can redistribute it and/or modify it under the terms of the - GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - N String Parser is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser - General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License along with this script set. - If not, see . - - -Basically, what this means is that if you make a program/game with NSP you can freely distribute it or - sell it, without exposing the program's/game's source code. However, if you decide to modify NSP, you'll - have to release its modified version under GNU Lesser General Public License as well. - - --------------------------------------------------------------------------------------------------------------- - >>BASIC GUIDELINES: -Initializing: To initialize the parser, call script NSP_initialize. You can change that script to use whatever tokens/operators suit you, but follow the instructions given there to avoid errors. @@ -31,7 +11,12 @@ Credit would be nice if you use it. -Freeing: To free the memory used by the parser, call script NSP_free. Regarding its argument, read section "Saving". - -Executing: To execute a string, call NSP_execute_string. + -Executing: To execute a string, call NSP_execute_string(). Note that you can use the "return" statement + within the code that's executed to return a value. If you do, execution will stop there + (which is expected behavior with "return" calls within scripts). As NSP can only work with + numbers and strings, the returned values can only be numbers and strings. Attempting to + return, for example, an array pointer will result in undefined behavior. If no return calls + get triggered in the string being executed, NSP_execute_string() will return undefined. -Evaluating: To evaluate a string (an expression or an equation in the form of a string, such as 5+6 or (my_number(x+y) / (20 mod 14)), or whatever, call script NSP_evaluate. Note that when @@ -44,17 +29,21 @@ Credit would be nice if you use it. error occurs, you should use some method which does not stop the Runner. When using NSP_evaluate, in the case of an error, that function will return the abort string (also defined in script NSP_initialize, by default it's NSP__ABORT). Note that trying to access uninitialized variables - will crash your game anyway, and there's no way to prevent that. However, it would be nice to - report any other situation where NSP crashed your program to see if it can be fixed - (Surgeon_ on GMC). + will crash your game anyway, and there's no way to prevent that. However, it would be good to + report any other situation where NSP crashed your program to see if it can be fixed. -Saving: When you want to execute or evaluate the same string multiple times, it is faster to pre-parse - the string (using NSP_save(...) function) and then use NSP_execute_saved(...) and - NSP_evaluate_saved(...). + the string (using the NSP_save(...) function) and then use NSP_execute_saved(...) and + NSP_evaluate_saved(...). You can also use NSP_check_saved(...) to see if pre-parsing was successful. + If it returns 0, that means that NSP discovered that the string was not valid input and therefor + it cannot be executed nor evaluated. If it returns 1, it means that no fault was detected in the + input, but be careful - it may still throw an error once executed / evaluated! + Example: - a=NSP_save("x=player_get_x();"); - NSP_execute_saved(a); + a=NSP_save("x=player_get_x();"); + if (NSP_check_saved(a)) + NSP_execute_saved(a); IMPORTANT: When you use NSP_save(...) function you get the information in the form of a ds_list and you should treat it as a ds_list - destroy it when you no longer need it! (For example: @@ -72,8 +61,7 @@ Credit would be nice if you use it. but better to be safe than sorry. -Blocks of code: You can use { and } to make blocks of code to be executed as a single thing after a, for - example, if statement. You should also put a semicolon after closing a block. - ( { -code- }; ) You can also use begin / end instead of { / } if you so desire. + example, if statement. You can also use begin / end instead of { / } if you so prefer. -Executing scripts: NSP can execute all custom scripts (using asset_get_index), and built-in ones that you define, however, it cannot execute scripts with more than 15 arguments. Also, if a @@ -84,12 +72,26 @@ Credit would be nice if you use it. --------------------------------------------------------------------------------------------------------------- +>>SUPPORTED OPERATORS: + -Comparison: + -Equal, Not equal, Greater than, Greater than or equal, Lower than, Lower than or equal + -Logical (not bitwise!): + -And, Or, Xor + -Bitwise: + /none/ + -Aritmetic: + -Addition, Subtraction, Multiplication, Division, Integer division (div), Modulo (mod), Power (x^y) + -Unary negation (-a) and an analogous unary + (+a) + -Other: + -Parenthesis for calling functions and overriding operation priorities + >>SUPPORTED BUILT-IN SCRIPTS: + + Note: By "built-in scripts" I mean "built in *functions*". + - show_message(), - - instance_create(), - - instance_destroy(), - - game_restart(), - - room_goto_next(). + - sqrt(), + - sqr(). *How to add more: Because asset_get_index does not work on built-in scripts, these have to be added manually. Find the nsp_execute_script(...) script (in the Main parser section). @@ -97,19 +99,23 @@ Credit would be nice if you use it. also remove them to prevent them from being used). >>SUPPORTED VARIABLES: - - id, x, y, speed, direction, hspeed, vspeed, image_angle, image_index, image_speed, - sprite_index, object_index, _hspeed, _vspeed, _health, a, b, c, d, i, t, z, counter. + - x, y. *How to add more: Because GM:S has no way of accessing variables dynamically, this part has to be done manually. You need to find two scripts, nsp_variable_set and nsp_variable_get (in the Variable parser section). In both of them, find the large "switch" construction and follow the already established format to add more variables to use (though you can also remove them to prevent them from being used). + + IMPORTANT: As of version 2.5.6, NSP can use variable_instance_* functions to access ANY local variables + dynamically. This also means that you can't prevent the end user from changing or adding any variable they want! + This behaviour is now active by default, but if you still want to use the old system with large switch + statements, find the enumerator NSP_VAR_SYS in script NSP_initialize() and set NSP_VAR_SYS.new = 0. >>SUPPORTED GLOBAL VARIABLES: - - score, health, lives, state, mouse_x, mouse_y. + - room_speed, state. - -NOTE: NSP reckognizes a global variable because of its ".global" prefix. Because of that, to read + -NOTE: NSP reckognizes a global variable because of its "global." prefix. Because of that, to read or write built-in global scope variables such as "score", you need to write "global.score", although ultimately the effect will be the same. @@ -118,6 +124,12 @@ Credit would be nice if you use it. established patern to add more global variables to use (though you can also remove them to prevent them from being used). + IMPORTANT: As of version 2.5.6, NSP can use variable_global_* functions to access ANY global variables + dynamically (though they still need a "global." prefix even if they are built-in). This also means that + you can't prevent the end user from changing or adding any variable they want! This behaviour is now + active by default, but if you still want to use the old system with large switch statements, find the + enumerator NSP_VAR_SYS in script NSP_initialize() and set NSP_VAR_SYS.new = 0. + >>SUPPORTED CONSTANTS: - mb_left, mb_right, mb_middle, vk_left, vk_right, vk_up, vk_down, vk_enter. @@ -128,18 +140,26 @@ Credit would be nice if you use it. from being used). These do not neccesarily have to be built-in constants, you can also use user-defined ones. ->>SUPPORTED SPECIAL WORDS: +>>SUPPORTED KEYWORDS: - self, - other. >>SUPPORTED STATEMENTS: - With, - Repeat, - - If, - - While. + - If/Else, + - While, + - Return. - -NOTE: All of these muse be in the following format: + -NOTE: All of these, except for Return, must be in the following format: [Statement] ([Counter/Condition]) [Code to execute]; <-- Semicolon is VERY important here! + Alternatively, they can be in this format: + [Statement] ([Counter/Condition]) { [Code to execute]; }; <-- This semicolon is optional. + (If statement can have an else statement and more code after the semicolon.) + + -NOTE: Return statement must be in the following format: + [Statement] [Expression]; + >>DSM FUNCTIONALITY: -NSP has a quick access functionality for a single global ds_map (use nspDsMsp to reference it if you @@ -150,15 +170,21 @@ Credit would be nice if you use it. NSP_DSM*=a etc. DSM is useful because ds_map keys can be strings and so can be accessed dynamically (in other words, when using DSM you can use any variable name, not just those defined in nsp_variable_* functions). + + IMPORTANT: The DSM reference word will hide any variables with the same name, so be careful. --------------------------------------------------------------------------------------------------------------- >>EXAMPLES: - (These are a few examples of what NSP can execute or appraise.) + (These are a few examples of what NSP can execute or evaluate.) - x=my_number(x+y) / ( (20 mod 14) * ('a'=='a') / (3 +- (6+4==7)) ) +16; - instance_create(x,y,obj_tester).vspeed=2; - with (other) {instance_destroy()}; - with (instance_create(32,32,obj_tester)) hspeed=1; - "my_number(1+my_number( ... +my_number(1))))))))))))))))))))))))))))))"; -*/ + + + + + diff --git a/source.gmx/scripts/NSP_check_saved.gml b/source.gmx/scripts/NSP_check_saved.gml new file mode 100644 index 0000000..87209c7 --- /dev/null +++ b/source.gmx/scripts/NSP_check_saved.gml @@ -0,0 +1,10 @@ +///NSP_check_saved(List ID) +/* + +Checks whether a saved (converted) string passed validation. + +Returns: 1 if the string is valid; 0 otherwise + +*/ + +return (argument0[|2] != 0); diff --git a/source.gmx/scripts/NSP_evaluate.gml b/source.gmx/scripts/NSP_evaluate.gml index 5d92269..fe92c98 100644 --- a/source.gmx/scripts/NSP_evaluate.gml +++ b/source.gmx/scripts/NSP_evaluate.gml @@ -1,24 +1,40 @@ ///NSP_evaluate(String) /* + Evaluates a string of GML code. + +Returns: Result of evaluation or the abort string. + */ -var nspListStr=global.nspListStr, - nspListPar=global.nspListPar; -var rv; +var nspListStr, nspListPar, + nspToken = global.nspToken; +var rv, succ; + +if (argument0 == "") return ""; -if argument0="" return ""; +nspListStr = ds_list_create(); +nspListPar = ds_list_create(); -nsp_convert_to_list(argument0,nspListStr); -nsp_list_parameters(nspListStr,nspListPar); +succ = nsp_convert_to_list(argument0, nspListStr, nspListPar); -rv=nsp_evaluate_list(0,ds_list_size(nspListStr)-1); +if (!succ) { + + NSP_notify("SCRIPT: NSP_evaluate. ERROR: String will not be evaluated because it could not be converted."); + + ds_list_destroy(nspListStr); + ds_list_destroy(nspListPar); + + return nspToken[NSP_TOK.abort]; + + } + +rv = nsp_evaluate_list(0, ds_list_size(nspListStr)-1, nspListStr, nspListPar); //SQ: if is_string(rv) and nsp_is_string(rv) rv=string_copy(rv,2,string_length(rv)-2); -ds_list_clear(nspListStr); -ds_list_clear(nspListPar); +ds_list_destroy(nspListStr); +ds_list_destroy(nspListPar); return rv; - diff --git a/source.gmx/scripts/NSP_evaluate_saved.gml b/source.gmx/scripts/NSP_evaluate_saved.gml index 2c6665b..7078114 100644 --- a/source.gmx/scripts/NSP_evaluate_saved.gml +++ b/source.gmx/scripts/NSP_evaluate_saved.gml @@ -1,22 +1,36 @@ ///NSP_evaluate_saved(List ID) /* + Evaluates a saved (converted) string. + +Returns: Result of evaluation or the abort string. + */ -var nspListStr=global.nspListStr, - nspListPar=global.nspListPar; +var nspListStr = ds_list_create(), + nspListPar = ds_list_create(); + nspToken = global.nspToken; var rv; -ds_list_copy(nspListStr,argument0[|0]); -ds_list_copy(nspListPar,argument0[|1]); +if (argument0[|2] == 0) { + + ds_list_destroy(nspListStr); + ds_list_destroy(nspListPar); -rv=nsp_evaluate_list(0,ds_list_size(nspListStr)-1); + NSP_notify("SCRIPT: NSP_evaluate_saved. ERROR: Input did not pass validation."); + return nspToken[NSP_TOK.abort]; + + } + +ds_list_copy(nspListStr, argument0[|0]); +ds_list_copy(nspListPar, argument0[|1]); + +rv = nsp_evaluate_list(0, ds_list_size(nspListStr)-1, nspListStr, nspListPar); //SQ: -if is_string(rv) and nsp_is_string(rv) - rv=string_copy(rv,2,string_length(rv)-2); +if (is_string(rv) and nsp_is_string(rv)) + rv = string_copy(rv, 2, string_length(rv)-2); -ds_list_clear(nspListStr); -ds_list_clear(nspListPar); +ds_list_destroy(nspListStr); +ds_list_destroy(nspListPar); return rv; - diff --git a/source.gmx/scripts/NSP_execute_saved.gml b/source.gmx/scripts/NSP_execute_saved.gml index 0c9d0b5..764cae5 100644 --- a/source.gmx/scripts/NSP_execute_saved.gml +++ b/source.gmx/scripts/NSP_execute_saved.gml @@ -1,22 +1,32 @@ ///NSP_execute_saved(List ID) /* + Executes a saved (converted) string. + +Returns: Argument of "return" statement or undefined + (see the documentation). + */ -var nspListStr=global.nspListStr, - nspListPar=global.nspListPar; +var nspListStr = ds_list_create(), + nspListPar = ds_list_create(), + rv; + +if (argument0[|2] == 0) { + + ds_list_destroy(nspListStr); + ds_list_destroy(nspListPar); + + NSP_notify("SCRIPT: NSP_execute_saved. ERROR: Input did not pass validation."); + return undefined; -ds_list_copy(nspListStr,argument0[|0]); -ds_list_copy(nspListPar,argument0[|1]); + } + +ds_list_copy(nspListStr, argument0[|0]); +ds_list_copy(nspListPar, argument0[|1]); -nsp_execute_master(0,ds_list_size(nspListStr)-1,false); +rv = nsp_execute_master(0, ds_list_size(nspListStr)-1, false, nspListStr, nspListPar); -ds_list_clear(nspListStr); -ds_list_clear(nspListPar); +ds_list_destroy(nspListStr); +ds_list_destroy(nspListPar); -//KLAZEN: moved error check internal here, calls the callabck function with the error string and returns status -if (global._nsp_error != '') { - codable_error_callback(global._nsp_error); - global._nsp_error=''; - return false; -} -return true; +return rv; diff --git a/source.gmx/scripts/NSP_execute_string.gml b/source.gmx/scripts/NSP_execute_string.gml index 5b5bfef..5f8f571 100644 --- a/source.gmx/scripts/NSP_execute_string.gml +++ b/source.gmx/scripts/NSP_execute_string.gml @@ -1,24 +1,39 @@ ///NSP_execute_string(String) /* + Executes a string of GML code. + +Returns: Argument of "return" statement or undefined + (see the documentation). + */ -var nspListStr=global.nspListStr, - nspListPar=global.nspListPar; +var nspListStr, nspListPar, rv, succ; + +if (argument0 == "") return undefined; + +nspListStr = ds_list_create(); +nspListPar = ds_list_create(); + +succ = nsp_convert_to_list(argument0, nspListStr, nspListPar); + +if (!succ) { -if argument0="" exit; + NSP_notify("SCRIPT: NSP_execute_string. ERROR: String will not be executed because it could not be converted."); -nsp_convert_to_list(argument0,nspListStr); -nsp_list_parameters(nspListStr,nspListPar); + ds_list_destroy(nspListStr); + ds_list_destroy(nspListPar); + + return undefined; + + } + +rv = nsp_execute_master(0, ds_list_size(nspListStr)-1, false, nspListStr, nspListPar); -nsp_execute_master(0,ds_list_size(nspListStr)-1,false); +ds_list_destroy(nspListStr); +ds_list_destroy(nspListPar); -ds_list_clear(nspListStr); -ds_list_clear(nspListPar); + //DEBUG: + //show_message("NSP_execute_string returned:"); + //show_message(rv); -//KLAZEN: moved error check internal here, calls the callabck function with the error string and returns status -if (global._nsp_error != '') { - codable_error_callback(global._nsp_error); - global._nsp_error=''; - return false; -} -return true; +return rv; diff --git a/source.gmx/scripts/NSP_free.gml b/source.gmx/scripts/NSP_free.gml index 7603c33..f75ffea 100644 --- a/source.gmx/scripts/NSP_free.gml +++ b/source.gmx/scripts/NSP_free.gml @@ -1,20 +1,24 @@ ///NSP_free(Free Saved); /* + Frees all the memory used by the parser. If argument0 is set to true then all data saved by using NSP_save(...) function will be freed as well. + +Returns: n/a + */ var; global.nspToken=0; -ds_list_destroy(global.nspListStr); -ds_list_destroy(global.nspListPar); +//ds_list_destroy(global.nspListStr); +//ds_list_destroy(global.nspListPar); -if global.nspDsMap<>-1 and ds_exists(global.nspDsMap,ds_type_map) +if (global.nspDsMap<>-1 and ds_exists(global.nspDsMap,ds_type_map)) ds_map_destroy(global.nspDsMap); -if argument0=true { +if argument0==true { repeat (ds_list_size(global.nspListSaved)) begin @@ -25,4 +29,3 @@ if argument0=true { } ds_list_destroy(global.nspListSaved); - diff --git a/source.gmx/scripts/NSP_free_saved.gml b/source.gmx/scripts/NSP_free_saved.gml index 7ea81fd..3c73cd2 100644 --- a/source.gmx/scripts/NSP_free_saved.gml +++ b/source.gmx/scripts/NSP_free_saved.gml @@ -1,6 +1,10 @@ ///NSP_free_saved(List ID) /* + Frees the memory used by a saved (converted) string. + +Returns: n/a + */ var index; @@ -10,4 +14,3 @@ ds_list_destroy(argument0); index=ds_list_find_index(global.nspListSaved,argument0); ds_list_delete(global.nspListSaved,index); - diff --git a/source.gmx/scripts/NSP_initialize.gml b/source.gmx/scripts/NSP_initialize.gml index 5367205..f6ffbcf 100644 --- a/source.gmx/scripts/NSP_initialize.gml +++ b/source.gmx/scripts/NSP_initialize.gml @@ -1,5 +1,6 @@ ///NSP_initialize() /* + Initializes the parser (for more info read NSP Documentation). Data that will be used: @@ -7,10 +8,14 @@ Data that will be used: NSP_TOK (enum) NSP_TYPE (enum) global.nspToken (1d array) - global.nspListStr (ds_list) - global.nspListPar (ds_list) global.nspListSaved (ds_list) global.nspDsMap (ds_map) + + Obsolete: + global.nspListStr (ds_list) + global.nspListPar (ds_list) + +Returns: n/a */ @@ -22,7 +27,6 @@ enum NSP_TOK { smaller, smaller_equal, //Combining: _and, _or, _xor, - _and2, _or2, //Math: add, subtract, multiply, divide, @@ -42,58 +46,64 @@ still be used as the operator for subtraction, but ONLY for subtraction.) // and 1 to 3 characters in length. //COMBINING: -global.nspToken[NSP_TOK._and] ="and"; -global.nspToken[NSP_TOK._or] ="or"; -global.nspToken[NSP_TOK._xor] ="xor"; -global.nspToken[NSP_TOK._and2] ="&&"; -global.nspToken[NSP_TOK._or2] ="||"; +global.nspToken[NSP_TOK._and] = "and"; +global.nspToken[NSP_TOK._or] = "or"; +global.nspToken[NSP_TOK._xor] = "xor"; //COMPARING: -global.nspToken[NSP_TOK.equal] ="=="; -global.nspToken[NSP_TOK.larger] =">"; -global.nspToken[NSP_TOK.larger_equal] =">="; -global.nspToken[NSP_TOK.smaller] ="<"; -global.nspToken[NSP_TOK.smaller_equal] ="<="; -global.nspToken[NSP_TOK.unequal] ="<>"; +global.nspToken[NSP_TOK.equal] = "=="; +global.nspToken[NSP_TOK.larger] = ">"; +global.nspToken[NSP_TOK.larger_equal] = ">="; +global.nspToken[NSP_TOK.smaller] = "<"; +global.nspToken[NSP_TOK.smaller_equal] = "<="; +global.nspToken[NSP_TOK.unequal] = "<>"; //MATH: -global.nspToken[NSP_TOK.add] ="+"; -global.nspToken[NSP_TOK.subtract] ="-"; -global.nspToken[NSP_TOK.multiply] ="*"; -global.nspToken[NSP_TOK.divide] ="/"; -global.nspToken[NSP_TOK._div] ="div"; -global.nspToken[NSP_TOK._mod] ="mod"; -global.nspToken[NSP_TOK._power] ="^"; +global.nspToken[NSP_TOK.add] = "+"; +global.nspToken[NSP_TOK.subtract] = "-"; +global.nspToken[NSP_TOK.multiply] = "*"; +global.nspToken[NSP_TOK.divide] = "/"; +global.nspToken[NSP_TOK._div] = "div"; +global.nspToken[NSP_TOK._mod] = "mod"; +global.nspToken[NSP_TOK._power] = "^"; //BITWISE: //Currently not supported. //OTHER: -global.nspToken[NSP_TOK.assign]="="; // Assignment operator. NOTE: In code, you can put your +global.nspToken[NSP_TOK.assign] = "="; // Assignment operator. NOTE: In code, you can put your // defined operator for adding, subtracting, dividing or // multiplying before the assignment operator to do // things like x+=32; -global.nspToken[NSP_TOK.abort]="GetToDaCHOPPA!"; // String to return upon failure. -global.nspToken[NSP_TOK.quote]="'"; // For beginnigs and ends of strings (within strings). +global.nspToken[NSP_TOK.abort] = "_NSP_ABORT_"; // String to return upon failure. +global.nspToken[NSP_TOK.quote] = "'"; // For beginnigs and ends of strings (within strings). // Must be a single character! //DSM: -global.nspToken[NSP_TOK.dsm_allowed]=1; // Whether DSM is allowed: 1 = Yes, 0 = No. -global.nspToken[NSP_TOK.dsm_name] ="NSP_DSM"; // Only relevant if DSM is allowed. +global.nspToken[NSP_TOK.dsm_allowed] = 1; // Whether DSM is allowed: 1 = Yes, 0 = No. +global.nspToken[NSP_TOK.dsm_name] = "NSP_DSM";// Only relevant if DSM is allowed. + +//VARIABLE SYSTEM: +enum NSP_VAR_SYS { + + new = 1 // If you want to use the new variable system (using the new variable_* functions) set new = 1. + // Otherwise set new = 0 to use the old system (not recommended). + } //*** Other: (Do not change this part) -global.nspListStr=ds_list_create(); -global.nspListPar=ds_list_create(); -global.nspListSaved=ds_list_create(); +//global.nspListStr = ds_list_create(); +//global.nspListPar = ds_list_create(); +global.nspListSaved = ds_list_create(); -if global.nspToken[NSP_TOK.dsm_allowed]=1 - global.nspDsMap=ds_map_create(); - else global.nspDsMap=-1; +if (global.nspToken[NSP_TOK.dsm_allowed] == 1) + global.nspDsMap = ds_map_create(); +else + global.nspDsMap = -1; //*** Data types: (Do not change this enumerator) enum NSP_TYPE { _symbol, //0 - _token, + _operator, _number, _string, _script, //4 @@ -104,7 +114,3 @@ enum NSP_TYPE { _dsm, _specword } - - -//EDIT BY KLAZEN: set a global flag to indicate an error has occurred -global._nsp_error=''; diff --git a/source.gmx/scripts/NSP_notify.gml b/source.gmx/scripts/NSP_notify.gml index f24cf13..82e613e 100644 --- a/source.gmx/scripts/NSP_notify.gml +++ b/source.gmx/scripts/NSP_notify.gml @@ -1,15 +1,22 @@ ///NSP_notify(Message, [OPT] List, Start, End) /* + Notifies the user about an error that has occured. You can change this script (read NSP Documentation for more info). + +Returns: n/a + */ var; -if (argument_count>1) { +//*** Do not change this part ***// +if (argument_count > 1) { - argument[0]+=" FAULTY CODE: "+nsp_list_to_string(argument[1],argument[2],argument[3],"^"); + argument[0] += " FAULTY CODE: " + nsp_list_to_string(argument[1], argument[2], argument[3], "^"); } + +// You can use argument[0] (string) from now on to report an error in any way. +// Default implementation: show_error(argument[0], false); -//EDIT BY KLAZEN: build the error string for later -global._nsp_error+=argument[0]+'#'; +show_error(argument[0], false); diff --git a/source.gmx/scripts/NSP_save.gml b/source.gmx/scripts/NSP_save.gml index 93035dd..9283142 100644 --- a/source.gmx/scripts/NSP_save.gml +++ b/source.gmx/scripts/NSP_save.gml @@ -1,20 +1,24 @@ ///NSP_save(String) /* -Returns ID of the DS List containing the data about the converted string. + +Converts a string into a ds_list, so that it can be executed / evaluated +later and multiple times faster than usual. + +Returns: ID of the ds_list containing the data about the converted string. + */ -var list_1,list_2,list_3; +var rv, list_1, list_2, list_3; -list_1=ds_list_create(); -list_2=ds_list_create(); -list_3=ds_list_create(); +list_1 = ds_list_create(); +list_2 = ds_list_create(); +list_3 = ds_list_create(); -nsp_convert_to_list(argument0,list_1); -nsp_list_parameters(list_1,list_2); +rv = nsp_convert_to_list(argument0, list_1, list_2); -list_3[|0]=list_1; -list_3[|1]=list_2; +list_3[|2] = rv; +list_3[|1] = list_2; +list_3[|0] = list_1; -ds_list_add(global.nspListSaved,list_3); +ds_list_add(global.nspListSaved, list_3); return list_3; - diff --git a/source.gmx/scripts/clearUndoStack.gml b/source.gmx/scripts/clearUndoStack.gml index cc1e3fd..e48eb3b 100644 --- a/source.gmx/scripts/clearUndoStack.gml +++ b/source.gmx/scripts/clearUndoStack.gml @@ -1,7 +1,7 @@ undoStackPos = 0; undoStackStart = 0; undoStackEnd = 0; -undoStackSize = 1024; +undoStackSize = 2048; for( var i = 0; i < undoStackSize; i++ ) { undoStack[i] = 'n'; diff --git a/source.gmx/scripts/cycleSkin.gml b/source.gmx/scripts/cycleSkin.gml index f3c4a7f..29a1b94 100644 --- a/source.gmx/scripts/cycleSkin.gml +++ b/source.gmx/scripts/cycleSkin.gml @@ -3,18 +3,18 @@ var skinCycleDir = argument0 var skinsfolder = prefix_project_path_if_needed('skins/') var filename = skinsfolder+'skins.ini' -if not FS_directory_exists(skinsfolder) { - FS_directory_create(skinsfolder) +if not directory_exists(skinsfolder) { + directory_create(skinsfolder) } -FS_ini_open(filename) -var str = FS_ini_read_string('skins','names','') -FS_ini_close() +ini_open(filename) +var str = ini_read_string('skins','names','') +ini_close() if str == '' { - FS_ini_open(filename) - FS_ini_write_string('skins','names','skin1,skin2,skin3,skin4') - FS_ini_close() + ini_open(filename) + ini_write_string('skins','names','skin1,skin2,skin3,skin4') + ini_close() inputOverlay(input_info,false,'skins/skins.ini has no skin folder names.#Please add some!') exit } diff --git a/source.gmx/scripts/deleteBackup.gml b/source.gmx/scripts/deleteBackup.gml index bb6a469..7f38990 100644 --- a/source.gmx/scripts/deleteBackup.gml +++ b/source.gmx/scripts/deleteBackup.gml @@ -1,4 +1,4 @@ -if FS_file_exists(prefix_project_path_if_needed('backup.jmap')) { - FS_file_delete(prefix_project_path_if_needed('backup.jmap')) +if file_exists(prefix_project_path_if_needed('backup.jmap')) { + file_delete(prefix_project_path_if_needed('backup.jmap')) } alarm[5] = global.backup_period diff --git a/source.gmx/scripts/killPlayer.gml b/source.gmx/scripts/killPlayer.gml index 25b4450..5b63826 100644 --- a/source.gmx/scripts/killPlayer.gml +++ b/source.gmx/scripts/killPlayer.gml @@ -1,8 +1,8 @@ if instance_exists(oPlayer) and global.deathEnabled { - audio_play_sound(sndDeath,0,0) - oDeathDisplay.death_count += 1 + audio_play_sound(sndDeath, 0, 0); + oDeathDisplay.death_count += 1; with oPlayer { - repeat 200 instance_create(x,y,oPlayerBlood) - instance_destroy() + repeat(irandom_range(32, 96)) { instance_create(x, y, oPlayerBlood); } + instance_destroy(); } } diff --git a/source.gmx/scripts/loadConfig.gml b/source.gmx/scripts/loadConfig.gml index 1b405f0..34eecae 100644 --- a/source.gmx/scripts/loadConfig.gml +++ b/source.gmx/scripts/loadConfig.gml @@ -1,10 +1,11 @@ // Load the currently set options from a previously saved ini file. var filename = prefix_project_path_if_needed('config.ini') -FS_ini_open(filename) +ini_open(filename) global.deathEnabled = FSIniReadReal('prefs','death',false) oEdit.snap = FSIniReadReal('prefs','gridsnap',32) -global.skinName = FS_ini_read_string('prefs','skin','pat_default') +global.skinName = ini_read_string('prefs','skin','pat_default') +global.deathAnimName = ini_read_string('prefs','deathanim','default') window_set_fullscreen(FSIniReadReal('prefs','fullscreen',false)) oWorld.alarm[0]=1 global.showanalysis = FSIniReadReal('prefs','showanalysis',true) @@ -15,10 +16,10 @@ global.showhitbox = FSIniReadReal('prefs','showhitbox',0) global.grid_draw = FSIniReadReal('prefs','grid_draw',false) global.mousecoords = FSIniReadReal('prefs','mousecoords',false) global.playery_extended = FSIniReadReal('prefs','playery_extended',false) -var depthstring = FS_ini_read_string('prefs','depthorder','0,1,2,3') +var depthstring = ini_read_string('prefs','depthorder','0,1,2,3') global.backup = FSIniReadReal('prefs','backup',true) global.checkupdates = FSIniReadReal('prefs','checkupdates',true) -FS_ini_close() +ini_close() if string_count(',',depthstring) != 3 depthstring = '0,1,2,3' ds_list_clear(global.depthList) diff --git a/source.gmx/scripts/loadMap.gml b/source.gmx/scripts/loadMap.gml index 62dde21..c7ffafa 100644 --- a/source.gmx/scripts/loadMap.gml +++ b/source.gmx/scripts/loadMap.gml @@ -2,9 +2,9 @@ var filename = argument0 -var f = FS_file_text_open_read(filename) -var content = FS_file_text_read_string(f) -FS_file_text_close(f) +var f = file_text_open_read(filename) +var content = file_text_read_string(f) +file_text_close(f) var index = 1 var currentstring = '' diff --git a/source.gmx/scripts/loadPlayer.gml b/source.gmx/scripts/loadPlayer.gml index 34f1583..fb311fe 100644 --- a/source.gmx/scripts/loadPlayer.gml +++ b/source.gmx/scripts/loadPlayer.gml @@ -1,6 +1,6 @@ -with oPlayer instance_destroy() -with oPlayerBlood instance_destroy() -global.grav = global.saveGrav -global.player_djump = true -global.player_xscale = global.savePlayerXScale -instance_create(global.savePlayerX, global.savePlayerY, oPlayer) +with oPlayer instance_destroy(); +with oPlayerBlood instance_destroy(); +global.grav = global.saveGrav; +global.player_djump = true; +global.player_xscale = global.savePlayerXScale; +instance_create(global.savePlayerX, global.savePlayerY, oPlayer); diff --git a/source.gmx/scripts/loadSkin.gml b/source.gmx/scripts/loadSkin.gml index 0f1dcf8..70ca66e 100644 --- a/source.gmx/scripts/loadSkin.gml +++ b/source.gmx/scripts/loadSkin.gml @@ -6,17 +6,17 @@ var skinfolder = prefix_project_path_if_needed('skins\'+skin_name+'\') var ini_filename = skinfolder+'skin_config.ini' var missing_ini_filename = prefix_project_path_if_needed('skin_config_missing.ini') -if not FS_directory_exists(skinfolder) { +if not directory_exists(skinfolder) { inputOverlay(input_info,false,"Couldn't find skin folder#"+skinfolder) ini_filename = missing_ini_filename } -else if not FS_file_exists(ini_filename) { +else if not file_exists(ini_filename) { inputOverlay(input_info,false,'Warning: '+ini_filename+' does not exist.') } -FS_ini_open(ini_filename) +ini_open(ini_filename) // meta -var skinver_string = FS_ini_read_string('meta','version','') +var skinver_string = ini_read_string('meta','version','') if skinver_string == '' { //inputOverlay(input_info,false,'Warning: no version provided in skin.') } @@ -29,28 +29,28 @@ else { // ui global.color_button = colorFromHsvDelimString( - FS_ini_read_string('ui','button_idle_color','0,0,175'),',') + ini_read_string('ui','button_idle_color','0,0,175'),',') global.color_buttonhover = colorFromHsvDelimString( - FS_ini_read_string('ui','button_active_color','0,0,255'),',') + ini_read_string('ui','button_active_color','0,0,255'),',') global.color_palettepressed = colorFromHsvDelimString( - FS_ini_read_string('ui','button_palette_pressed_color','0,0,0'),',') + ini_read_string('ui','button_palette_pressed_color','0,0,0'),',') global.buttonhoveralpha = FSIniReadReal('ui','button_active_alpha',0.5) global.buttonpalettepressedalpha = FSIniReadReal('ui','button_palette_pressed_alpha',0.5) global.buttonhoverborder = FSIniReadReal('ui','button_active_border',false) // objects -var colorstring = FS_ini_read_string('objects','killer_idle_color','0,0,255') +var colorstring = ini_read_string('objects','killer_idle_color','0,0,255') global.color_killerhue = real(splitDelimString(colorstring,',',0)) global.color_killersat = real(splitDelimString(colorstring,',',1)) global.color_killerval = real(splitDelimString(colorstring,',',2)) global.color_killer = colorFromHsvDelimString(colorstring,',') -var colorstring = FS_ini_read_string('objects','killer_active_color','0,128,255') +var colorstring = ini_read_string('objects','killer_active_color','0,128,255') global.color_killer2hue = real(splitDelimString(colorstring,',',0)) global.color_killer2sat = real(splitDelimString(colorstring,',',1)) global.color_killer2val = real(splitDelimString(colorstring,',',2)) global.color_killer2 = colorFromHsvDelimString(colorstring,',') global.color_warp = colorFromHsvDelimString( - FS_ini_read_string('objects','warp_color','67,196,239'),',') + ini_read_string('objects','warp_color','67,196,239'),',') global.bulletblockeralpha = FSIniReadReal('objects','bulletblocker_alpha',0.3) global.spikeframes = FSIniReadReal('objects','spike_frames',1) global.spikeanimspeed = FSIniReadReal('objects','spike_animspeed',1) @@ -58,11 +58,11 @@ global.minispikeframes = FSIniReadReal('objects','minispike_frames',1) global.minispikeanimspeed = FSIniReadReal('objects','minispike_animspeed',1) // bg -var bg_type = FS_ini_read_string('bg','type','stretch') +var bg_type = ini_read_string('bg','type','stretch') var bg_hspeed = FSIniReadReal('bg','hspeed',0) var bg_vspeed = FSIniReadReal('bg','vspeed',0) -FS_ini_close() -FS_file_delete(missing_ini_filename) +ini_close() +//file_delete(missing_ini_filename) // assign sprites from file @@ -117,11 +117,11 @@ for (var i=0; i<100; i+=1) { default: continue } - if FS_file_exists(skinfolder+file) { + if file_exists(skinfolder+file) { var copied_png = working_directory+'copied_skin_image.png' - FS_file_copy(skinfolder+file, copied_png) + file_copy(skinfolder+file, copied_png) var spr = sprite_add(copied_png,frames,false,false,xo,yo) - FS_file_delete(copied_png) + file_delete(copied_png) if spr != -1 { sprite_assign(spr_index,spr) sprite_delete(spr) @@ -138,11 +138,11 @@ for (var i=0; i<100; i+=1) { // assign background from file file = 'bg.png' -if FS_file_exists(skinfolder+file) { +if file_exists(skinfolder+file) { var copied_png = working_directory+'copied_skin_image.png' - FS_file_copy(skinfolder+file, copied_png) + file_copy(skinfolder+file, copied_png) var bg = background_add(copied_png,false,false) - FS_file_delete(copied_png) + file_delete(copied_png) if bg != -1 { background_assign(bgBackground,bg) background_delete(bg) @@ -175,5 +175,3 @@ background_y = 0 if resource_add_errors != '' { inputOverlay(input_info,false,'Error when adding resources:#'+resource_add_errors+'#Try double checking everything.') } - -FS_clean_temporary() diff --git a/source.gmx/scripts/loadStartupMap.gml b/source.gmx/scripts/loadStartupMap.gml index c300b5b..3fda9fe 100644 --- a/source.gmx/scripts/loadStartupMap.gml +++ b/source.gmx/scripts/loadStartupMap.gml @@ -1,9 +1,9 @@ var filename = prefix_project_path_if_needed('startup.jmap') -if not FS_file_exists(filename) { - var f = FS_file_text_open_write(filename) - FS_file_text_write_string(f,'jtool|1.2.0|inf:0|dot:0|sav:1|bor:0|px:40u8g00000000|py:40ubg00000000|ps:1|objects:-h01h01g01f0-g0kg0') - FS_file_text_close(f) +if not file_exists(filename) { + var f = file_text_open_write(filename) + file_text_write_string(f,'jtool|1.2.0|inf:0|dot:0|sav:1|bor:0|px:40u8g00000000|py:40ubg00000000|ps:1|objects:-h01h01g01f0-g0kg0') + file_text_close(f) } global.shouldresetloadedmapname = true loadMap(filename) diff --git a/source.gmx/scripts/mainInit.gml b/source.gmx/scripts/mainInit.gml index af8743f..313f4e0 100644 --- a/source.gmx/scripts/mainInit.gml +++ b/source.gmx/scripts/mainInit.gml @@ -8,17 +8,17 @@ but I think that's a safe assumption. */ global.run_from_editor = string_pos('gm_ttt',working_directory) != 0 -global.editor_project_path = 'C:\Users\User\Downloads\jtool 1.x.y\source.gmx' +global.editor_project_path = 'C:\Users\Starz0r\Development\jtool' // add backslash to end if string_char_at(global.editor_project_path,string_length(global.editor_project_path)) != '\' { global.editor_project_path += '\' } -if global.run_from_editor and not FS_directory_exists(global.editor_project_path) { +if global.run_from_editor and not directory_exists(global.editor_project_path) { show_message("The editor project path you specified doesnt exist!#Edit the variable in the misc/mainInit script.") game_end() } -ex_patch_window_close_capture(true) +window_command_hook(window_command_close); // global state global.state = globalstate_idle @@ -30,8 +30,8 @@ global.frameaction_jumpslow = false global.player_xscale = 1 // setting the player's xscale causes physics issues global.joketitleindex = 0 // used in buttonCallback_JokeTitle global.version_major = 1 -global.version_minor = 3 -global.version_patch = 5 +global.version_minor = 4 +global.version_patch = 0 global.version_string = string(global.version_major)+'.'+string(global.version_minor)+'.'+string(global.version_patch) global.input_string = '' global.input_bool = false @@ -53,10 +53,11 @@ global.killer_fadeduration = 4 global.restartWithDJump = true; global.checkNudgeEarly = true; +NSP_initialize(); loadConfig() var backupFilename = prefix_project_path_if_needed('backup.jmap') -if FS_file_exists(backupFilename) { +if file_exists(backupFilename) { loadMap(backupFilename) inputOverlay(input_info,false,'Jtool did not exit successfully.#Backup map has been loaded.') } diff --git a/source.gmx/scripts/mainInit.gml.bak b/source.gmx/scripts/mainInit.gml.bak new file mode 100644 index 0000000..b5de7f8 --- /dev/null +++ b/source.gmx/scripts/mainInit.gml.bak @@ -0,0 +1,127 @@ +// Main init script that should be called once upon game start. + +/* tell if we're running from the editor or from the compiled game, + since that function isn't built into gm. + the editor directory is similar to this: + C:\Users\User\AppData\Local\Temp\gm_ttt_881\gm_ttt_30167\ + this assumes the user doesn't have their own folder containing "gm_ttt", + but I think that's a safe assumption. +*/ +global.run_from_editor = string_pos('gm_ttt',working_directory) != 0 +<<<<<<< HEAD:jtool.gmx/scripts/mainInit.gml +global.editor_project_path = 'C:\Users\Starz0r\Desktop\jtool' +======= +global.editor_project_path = 'C:\Users\User\Downloads\jtool 1.x.y\source.gmx' +>>>>>>> upstream/master:source.gmx/scripts/mainInit.gml +// add backslash to end +if string_char_at(global.editor_project_path,string_length(global.editor_project_path)) != '\' { + global.editor_project_path += '\' +} +if global.run_from_editor and not directory_exists(global.editor_project_path) { + show_message("The editor project path you specified doesnt exist!#Edit the variable in the misc/mainInit script.") + game_end() +} + +window_command_hook(window_command_close); + +// global state +global.state = globalstate_idle +global.comboboxselected = false +global.count = 0 +global.frameaction_jump = false +global.frameaction_djump = false +global.frameaction_jumpslow = false +global.player_xscale = 1 // setting the player's xscale causes physics issues +global.joketitleindex = 0 // used in buttonCallback_JokeTitle +global.version_major = 1 +<<<<<<< HEAD:jtool.gmx/scripts/mainInit.gml +global.version_minor = 4 +global.version_patch = 0 +======= +global.version_minor = 3 +global.version_patch = 5 +>>>>>>> upstream/master:source.gmx/scripts/mainInit.gml +global.version_string = string(global.version_major)+'.'+string(global.version_minor)+'.'+string(global.version_patch) +global.input_string = '' +global.input_bool = false +global.input_cancel = false +global.depthList = ds_list_create() +global.waterlocked = false +global.backup_period = 5*60*50 +alarm[5] = global.backup_period +global.BackupFailSafe = false +global.shouldresetloadedmapname = false + +// maybe later load from map +global.grav = 1 +global.saveGrav = 1 + +// might load from config later +global.killer_holdduration = 12 +global.killer_fadeduration = 4 +global.restartWithDJump = true; +global.checkNudgeEarly = true; + +NSP_initialize(); +loadConfig() + +var backupFilename = prefix_project_path_if_needed('backup.jmap') +if file_exists(backupFilename) { + loadMap(backupFilename) + inputOverlay(input_info,false,'Jtool did not exit successfully.#Backup map has been loaded.') +} +else { + loadStartupMap() + if global.checkupdates { + versionRequestId = http_get('https://raw.githubusercontent.com/patrickgh3/jtool/master/current-version.json') + } +} + +// misc +randomize() +display_set_gui_size(view_wport,view_hport) +window_set_caption('jtool') +// load keys from file sometime? idk +global.key_left = vk_left +global.key_right = vk_right +global.key_up = vk_up +global.key_down = vk_down +global.key_jump = vk_shift +global.key_shoot = ord('Z') +global.key_restart = ord('R') +global.key_suicide = ord('Q') +global.key_pause = vk_escape +<<<<<<< HEAD:jtool.gmx/scripts/mainInit.gml +======= +global.record = false; // 0=noone,1=record,2=play + +global.recordList = ds_list_create(); +global.recordX = 0; +global.recordY = 0; +global.recordGrav = 1; +global.recordXscale = 1; +global.recordVspeed = 0; +global.recordDjump = true +global.continueclicked = false +global.pausedX = 0 +global.pausedY = 0 +global.pausedgrav = 1 +global.pausedplayer_xscale = 1 +global.pausedVspeed = 0 +global.pausedDjump = true + +//Record Save State Variables +global.recordListSS5 = ds_list_create() +global.recordListSS6 = ds_list_create() +global.recordListSS7 = ds_list_create() +global.recordListSS8 = ds_list_create() +global.recordListSS9 = ds_list_create() +global.recordListSS10 = ds_list_create() +global.recordListSS11 = ds_list_create() +global.recordListSS12 = ds_list_create() + +for (var i = 1; i < 101; i +=1) { +global.recordListRewind[i] = ds_list_create() } + +codable_initialize() +>>>>>>> upstream/master:source.gmx/scripts/mainInit.gml diff --git a/source.gmx/scripts/nsp_arithmetic_calculate.gml b/source.gmx/scripts/nsp_arithmetic_calculate.gml index 67a432e..3e93b12 100644 --- a/source.gmx/scripts/nsp_arithmetic_calculate.gml +++ b/source.gmx/scripts/nsp_arithmetic_calculate.gml @@ -8,6 +8,10 @@ var nspToken=global.nspToken; //Add: if argument2=nspToken[NSP_TOK.add] { + //DEBUG: + //show_message("Arg0: "+nsp_string_force(argument0)+", isString: "+string(is_string(argument0))); + //show_message("Arg1: "+nsp_string_force(argument1)+", isString: "+string(is_string(argument1))); + if is_string(argument0) { if nsp_is_number(argument0) argument0=real(argument0) @@ -19,7 +23,11 @@ if argument2=nspToken[NSP_TOK.add] { argument1=real(argument1) else argument1=string_delete(argument1,1,1); } - + + //DEBUG: + //show_message("Arg0: "+nsp_string_force(argument0)+", isString: "+string(is_string(argument0))); + //show_message("Arg1: "+nsp_string_force(argument1)+", isString: "+string(is_string(argument1))); + return nsp_string_force(argument0+argument1); } @@ -72,4 +80,3 @@ if argument2=nspToken[NSP_TOK._power] { } - diff --git a/source.gmx/scripts/nsp_build_grid.gml b/source.gmx/scripts/nsp_build_grid.gml index 8c31f09..bf30b51 100644 --- a/source.gmx/scripts/nsp_build_grid.gml +++ b/source.gmx/scripts/nsp_build_grid.gml @@ -1,9 +1,9 @@ -///nsp_build_grid(Start, End) +///nsp_build_grid(Start, End, StrList, ParList) /* Underlying NSP script. */ -var nspListStr=global.nspListStr, - nspListPar=global.nspListPar; +var nspListStr = argument2, + nspListPar = argument3; var i,d,list_min,list_max,grid; list_min=argument0; @@ -21,4 +21,3 @@ for (i=0; i<=d; i+=1) begin end; return grid; - diff --git a/source.gmx/scripts/nsp_combination_calculate.gml b/source.gmx/scripts/nsp_combination_calculate.gml index 81a6c7a..70dfafd 100644 --- a/source.gmx/scripts/nsp_combination_calculate.gml +++ b/source.gmx/scripts/nsp_combination_calculate.gml @@ -11,14 +11,14 @@ if is_string(argument1) argument1=real(argument1); //And: -if argument2=nspToken[NSP_TOK._and] or argument2=nspToken[NSP_TOK._and2] { +if argument2=nspToken[NSP_TOK._and] { return string( (argument0 and argument1)*1.0 ); } //Or: -if argument2=nspToken[NSP_TOK._or] or argument2=nspToken[NSP_TOK._or2] { +if argument2=nspToken[NSP_TOK._or] { return string( (argument0 or argument1)*1.0 ); @@ -32,4 +32,3 @@ if argument2=nspToken[NSP_TOK._xor] { } - diff --git a/source.gmx/scripts/nsp_comparison_calculate.gml b/source.gmx/scripts/nsp_comparison_calculate.gml index 2219de0..d070104 100644 --- a/source.gmx/scripts/nsp_comparison_calculate.gml +++ b/source.gmx/scripts/nsp_comparison_calculate.gml @@ -54,4 +54,3 @@ if argument2=nspToken[NSP_TOK.smaller_equal] { } - diff --git a/source.gmx/scripts/nsp_convert_to_list.gml b/source.gmx/scripts/nsp_convert_to_list.gml index 2974ce4..a12295f 100644 --- a/source.gmx/scripts/nsp_convert_to_list.gml +++ b/source.gmx/scripts/nsp_convert_to_list.gml @@ -1,232 +1,58 @@ -///nsp_convert_to_list(String, Target List) +///nsp_convert_to_list(String, Token List, Types List) /* Underlying NSP script. +Returns: 1 = Success, 0 = Failure */ -var i,work_str,pri_q,token,tokenArray,list; -var copy_1,copy_2,copy_3; +var work_str, token, types, succ; //Setup: -work_str=argument0; -list=argument1; - -tokenArray=global.nspToken; - -work_str=nsp_string_crop(work_str); - -//Enter the loop: -while string_length(work_str)>0 { - - pri_q=1; - token=""; - - for (i=1; i<=string_length(work_str); i+=1) begin - - copy_1=string_copy(work_str,i,1); - copy_2=string_copy(work_str,i,2); - copy_3=string_copy(work_str,i,3); - - if string_copy(work_str,i,1)=tokenArray[NSP_TOK.quote] - pri_q*=-1; - - //Check for tokens: - if pri_q=1 { - - //Whitespace: - if (copy_1)=" " { - if i<>1 { - ds_list_add(list,string_copy(work_str,1,i-1)); - work_str=string_delete(work_str,1,i); - break; - } +work_str = argument0; +token = argument1; +types = argument2; + +if (work_str == "") { + + NSP_notify("SCRIPT: nsp_convert_to_list. ERROR: Empty string provided."); + return 0; + + } + +//Work: +succ = nsp_tokenize(nsp_string_crop(work_str), token); + +if (!succ) { + + NSP_notify("SCRIPT: nsp_convert_to_list. ERROR: Tokenization failed."); + return 0; + + } + +succ = nsp_list_set_types(token, types); + +if (!succ) { + + NSP_notify("SCRIPT: nsp_convert_to_list. ERROR: Types could not be determined."); + return 0; + + } + +succ = nsp_list_tidy_and_verify(token, types); + +if (!succ) { + + NSP_notify("SCRIPT: nsp_convert_to_list. ERROR: Verification not passed."); + return 0; + + } + +/*show_debug_message("List is now (3rd pass):" + "#"); +for (i=0; i1 and string_digits(string_copy(work_str,i+1,1))<>string_copy(work_str,i+1,1) { - ds_list_add(list,string_copy(work_str,1,i-1)); - work_str=string_delete(work_str,1,i-1); - break; - } - - } - //Default tokens: - else if ( copy_1="{" - or copy_1="}" - or copy_1="(" - or copy_1=")" - or copy_1=";" - or copy_1="," ) { - - token=copy_1; - - if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); - ds_list_add(list,token); - work_str=string_delete(work_str,1,i); - break; - - } - //Tokens of length 3: - else if ( copy_3=tokenArray[NSP_TOK.multiply] - or copy_3=tokenArray[NSP_TOK.divide] - or copy_3=tokenArray[NSP_TOK._div] - or copy_3=tokenArray[NSP_TOK._mod] - or copy_3=tokenArray[NSP_TOK._power] - or copy_3=tokenArray[NSP_TOK.add] - or copy_3=tokenArray[NSP_TOK.subtract] - or copy_3=tokenArray[NSP_TOK.equal] - or copy_3=tokenArray[NSP_TOK.larger] - or copy_3=tokenArray[NSP_TOK.larger_equal] - or copy_3=tokenArray[NSP_TOK.smaller] - or copy_3=tokenArray[NSP_TOK.smaller_equal] - or copy_3=tokenArray[NSP_TOK.unequal] - or copy_3=tokenArray[NSP_TOK._and] - or copy_3=tokenArray[NSP_TOK._or] - or copy_3=tokenArray[NSP_TOK._and2] - or copy_3=tokenArray[NSP_TOK._or2] - or copy_3=tokenArray[NSP_TOK._xor] - or copy_3=tokenArray[NSP_TOK.assign] ) { - - token=copy_3; - if nsp_token_is_valid(token,string_copy(work_str,i-1,3+2)) { - - if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); - ds_list_add(list,token); - work_str=string_delete(work_str,1,i+2); - break; - } - } - //Tokens of length 2: - else if ( copy_2=tokenArray[NSP_TOK.multiply] - or copy_2=tokenArray[NSP_TOK.divide] - or copy_2=tokenArray[NSP_TOK._div] - or copy_2=tokenArray[NSP_TOK._mod] - or copy_2=tokenArray[NSP_TOK._power] - or copy_2=tokenArray[NSP_TOK.add] - or copy_2=tokenArray[NSP_TOK.subtract] - or copy_2=tokenArray[NSP_TOK.equal] - or copy_2=tokenArray[NSP_TOK.larger] - or copy_2=tokenArray[NSP_TOK.larger_equal] - or copy_2=tokenArray[NSP_TOK.smaller] - or copy_2=tokenArray[NSP_TOK.smaller_equal] - or copy_2=tokenArray[NSP_TOK.unequal] - or copy_2=tokenArray[NSP_TOK._and] - or copy_2=tokenArray[NSP_TOK._or] - or copy_2=tokenArray[NSP_TOK._and2] - or copy_2=tokenArray[NSP_TOK._or2] - or copy_2=tokenArray[NSP_TOK._xor] - or copy_2=tokenArray[NSP_TOK.assign] ) { - - token=copy_2; - if nsp_token_is_valid(token,string_copy(work_str,i-1,2+2)) { - - if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); - ds_list_add(list,token); - work_str=string_delete(work_str,1,i+1); - break; - - } - - } - //Tokens of length 1: - else if ( copy_1=tokenArray[NSP_TOK.multiply] - or copy_1=tokenArray[NSP_TOK.divide] - or copy_1=tokenArray[NSP_TOK._div] - or copy_1=tokenArray[NSP_TOK._mod] - or copy_1=tokenArray[NSP_TOK._power] - or copy_1=tokenArray[NSP_TOK.add] - or copy_1=tokenArray[NSP_TOK.subtract] - or copy_1=tokenArray[NSP_TOK.equal] - or copy_1=tokenArray[NSP_TOK.larger] - or copy_1=tokenArray[NSP_TOK.larger_equal] - or copy_1=tokenArray[NSP_TOK.smaller] - or copy_1=tokenArray[NSP_TOK.smaller_equal] - or copy_1=tokenArray[NSP_TOK.unequal] - or copy_1=tokenArray[NSP_TOK._and] - or copy_1=tokenArray[NSP_TOK._or] - or copy_1=tokenArray[NSP_TOK._and2] - or copy_1=tokenArray[NSP_TOK._or2] - or copy_1=tokenArray[NSP_TOK._xor] - or copy_1=tokenArray[NSP_TOK.assign] ) { - - token=copy_1; - if nsp_token_is_valid(token,string_copy(work_str,i-1,1+2)) { - - if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); - ds_list_add(list,token); - work_str=string_delete(work_str,1,i); - break; - - } - - } - else if i=string_length(work_str) { - ds_list_add(list,work_str); - work_str=""; - break; - } - - } - - end; - - - } - -//Finalize: -i=0; -while (i0 { - list[|i+1]="-"+nsp_string_crop(list[|i+1]); - ds_list_delete(list,i); - } - } - break; - - case "global": - list[|i+1]="global"+nsp_string_crop(list[|i+1]); - ds_list_delete(list,i); - break; - - case "": - ds_list_delete(list,i); - i-=1; - break; - - default: - var c; - c=nsp_get_constant(list[|i]); - if (c<>-9999) - list[|i]=string(c); - break; - - end; - - i+=1; - -end; - diff --git a/source.gmx/scripts/nsp_dsm_get.gml b/source.gmx/scripts/nsp_dsm_get.gml index 877c950..18ea6cc 100644 --- a/source.gmx/scripts/nsp_dsm_get.gml +++ b/source.gmx/scripts/nsp_dsm_get.gml @@ -13,4 +13,3 @@ if nspToken[NSP_TOK.dsm_allowed]=1 return nspToken[NSP_TOK.abort]; } - diff --git a/source.gmx/scripts/nsp_dsm_set.gml b/source.gmx/scripts/nsp_dsm_set.gml index 2f26b5d..0860d91 100644 --- a/source.gmx/scripts/nsp_dsm_set.gml +++ b/source.gmx/scripts/nsp_dsm_set.gml @@ -19,4 +19,3 @@ if nspToken[NSP_TOK.dsm_allowed]=1 exit; } - diff --git a/source.gmx/scripts/nsp_evaluate_list.gml b/source.gmx/scripts/nsp_evaluate_list.gml index d98c24e..db89ac1 100644 --- a/source.gmx/scripts/nsp_evaluate_list.gml +++ b/source.gmx/scripts/nsp_evaluate_list.gml @@ -1,9 +1,9 @@ -///nsp_evaluate_list(Start, End) +///nsp_evaluate_list(Start, End, StrList, ParList) /* Underlying NSP script. */ -var nspListStr=global.nspListStr, - nspListPar=global.nspListPar, +var nspListStr = argument2, + nspListPar = argument3, nspToken=global.nspToken; var list_min,list_max; @@ -16,8 +16,7 @@ if (list_min=list_max) //2. If it's not single, then it's an expression or a script: var grid,rv; -grid=nsp_build_grid(list_min,list_max); -rv=nsp_evaluate_long(grid,false); +grid=nsp_build_grid(list_min, list_max, nspListStr, nspListPar); +rv=nsp_evaluate_long(grid, false); return rv; - diff --git a/source.gmx/scripts/nsp_evaluate_long.gml b/source.gmx/scripts/nsp_evaluate_long.gml index 52af60a..7501fcc 100644 --- a/source.gmx/scripts/nsp_evaluate_long.gml +++ b/source.gmx/scripts/nsp_evaluate_long.gml @@ -1,4 +1,4 @@ -///nsp_evaluate_long(Grid, Recursive call, [Optional] Start, [Optional] End) +///nsp_evaluate_long(Grid, Nested call, [Optional] Start, [Optional] End) /* Underlying NSP script. */ @@ -40,7 +40,7 @@ while (i<=list_max) begin //Find arguments: pri_b=0; - var arg,counter=0,pos_a=i+2; + var arg, counter = 0, pos_a = i+2; arg[0]=0; for (t=pos_a; t<=list_max; t+=1) { @@ -88,6 +88,13 @@ while (i<=list_max) begin //SQ: if is_string(rv) rv=nspToken[NSP_TOK.quote]+rv+nspToken[NSP_TOK.quote]; + // Special case - the script was the only thing to evaluate: + if (i == list_min and t == list_max) { + ds_grid_destroy(g); + return rv; + } + // *** + nsp_grid_shift(g,i+1,t); if is_real(rv) @@ -176,7 +183,7 @@ while (i<=list_max) begin } if is_real(target) { - a=nsp_variable_get(target,variable); + a=nsp_variable_get_br(target,variable); } else { a=nsp_dsm_get(variable); @@ -288,7 +295,7 @@ var a,token,val_l,val_r; i=list_min; while (i>list_min = " + string(list_min) + ", list_max = " + string(list_max) + ", i = " + string(i)); + while (i>list_min = " + string(list_min) + ", list_max = " + string(list_max) + ", i = " + string(i)); + } } @@ -369,7 +389,7 @@ while (i=list_min - nsp_execute_master(list_min,list_max,argument2); - +if list_max>=list_min { + rv=nsp_execute_master(list_min, list_max, argument2, nspListStr, nspListPar); + if !is_undefined(rv) return rv; + } + +return undefined; diff --git a/source.gmx/scripts/nsp_execute_script.gml b/source.gmx/scripts/nsp_execute_script.gml index a1f059d..084ff79 100644 --- a/source.gmx/scripts/nsp_execute_script.gml +++ b/source.gmx/scripts/nsp_execute_script.gml @@ -20,18 +20,31 @@ if is_array(argument1) { } //PART 1 (Built-in scripts): ------------------------------------------------------------------------------------------ +switch (argument0) begin -//EDIT BY KLAZEN: move this to a more visible place -rv = codable_execute_script(argument0,argument1); -if rv == undefined && asset_get_type(argument0)<>asset_script { + case "show_message": + show_message(argument1[0]); + return 0; + + case "sqr": + return sqr(argument1[0]); + + case "sqrt": + return sqrt(argument1[0]); + + // Add more here... + + default: + if asset_get_type(argument0)<>asset_script { NSP_notify("SCRIPT: nsp_execute_script. ERROR: Script not supported ( "+argument0+" )."); return nspToken[NSP_TOK.abort]; -} -else return rv; + } + break; + +end; //PART 2 (Custom scripts): -------------------------------------------------------------------------------------------- -//EDIT BY KLAZEN: don't support custom scripts -/* + argument0=asset_get_index(argument0); if is_array(argument1) @@ -108,7 +121,8 @@ switch (a) begin NSP_notify("SCRIPT: nsp_execute_script. ERROR: Too many arguments."); return nspToken[NSP_TOK.abort]; break; - + end; -*/ + return rv; + diff --git a/source.gmx/scripts/nsp_execute_single.gml b/source.gmx/scripts/nsp_execute_single.gml index ff2ebc4..fe83a68 100644 --- a/source.gmx/scripts/nsp_execute_single.gml +++ b/source.gmx/scripts/nsp_execute_single.gml @@ -1,9 +1,9 @@ -///nsp_execute_single(Start, End) +///nsp_execute_single(Start, End, StrList, ParList) /* Underlying NSP script. */ -var nspListStr=global.nspListStr, - nspListPar=global.nspListPar, +var nspListStr = argument2, + nspListPar = argument3, nspToken=global.nspToken; var i,av,list_min,list_max,pos,op_char,as_var_max,exec_code_min; @@ -53,7 +53,7 @@ if pos<>-1 { } //***Evaluate code: -av=nsp_evaluate_list(exec_code_min,list_max); +av=nsp_evaluate_list(exec_code_min, list_max, nspListStr, nspListPar); if nsp_is_equal(av,nspToken[NSP_TOK.abort]) { NSP_notify("SCRIPT: nsp_execute_single. ERROR: Aborting because evaluation failed.",nspListStr,list_min,list_max); return nspToken[NSP_TOK.abort]; @@ -80,7 +80,7 @@ if as_var_max<>-1 { mode=3; } else { - target=nsp_evaluate_list(list_min,as_var_max-1); + target=nsp_evaluate_list(list_min, as_var_max-1, nspListStr, nspListPar); if nsp_is_equal(target,nspToken[NSP_TOK.abort]) { NSP_notify("SCRIPT: nsp_execute_single. ERROR: Cannot assign value because target could not be evaluated.",nspListStr,list_min,list_max); @@ -111,7 +111,7 @@ if as_var_max<>-1 { if mode<=1 { - old_val=nsp_variable_get(target,varname); + old_val=nsp_variable_get_br(target,varname); if nsp_is_equal(old_val,nspToken[NSP_TOK.abort]) { exit; } @@ -121,7 +121,7 @@ if as_var_max<>-1 { } else if mode=2 { - old_val=nsp_variable_global_get(varname); + old_val=nsp_variable_global_get_br(varname); if nsp_is_equal(old_val,nspToken[NSP_TOK.abort]) { exit; } @@ -147,14 +147,14 @@ if as_var_max<>-1 { case "+": if is_real(old_val) - av=real(nsp_arithmetic_calculate(av,old_val,nspToken[NSP_TOK.add])) - else av=nsp_arithmetic_calculate(av,old_val,nspToken[NSP_TOK.add]); + av=real(nsp_arithmetic_calculate(old_val,av,nspToken[NSP_TOK.add])) + else av=nsp_arithmetic_calculate(old_val,av,nspToken[NSP_TOK.add]); if mode<=1 { - nsp_variable_set(target,varname,av); + nsp_variable_set_br(target,varname,av); } else if mode=2 { - nsp_variable_global_set(varname,av); + nsp_variable_global_set_br(varname,av); } else if mode=3 { nsp_dsm_set(varname,av); @@ -164,10 +164,10 @@ if as_var_max<>-1 { case "-": if mode<=1 { - nsp_variable_set(target,varname,old_val-av); + nsp_variable_set_br(target,varname,old_val-av); } else if mode=2 { - nsp_variable_global_set(varname,old_val-av); + nsp_variable_global_set_br(varname,old_val-av); } else if mode=3 { nsp_dsm_set(varname,old_val-av); @@ -176,10 +176,10 @@ if as_var_max<>-1 { case "*": if mode<=1 { - nsp_variable_set(target,varname,old_val*av); + nsp_variable_set_br(target,varname,old_val*av); } else if mode=2 { - nsp_variable_global_set(varname,old_val*av); + nsp_variable_global_set_br(varname,old_val*av); } else if mode=3 { nsp_dsm_set(varname,old_val*av); @@ -188,10 +188,10 @@ if as_var_max<>-1 { case "/": if mode<=1 { - nsp_variable_set(target,varname,old_val/av); + nsp_variable_set_br(target,varname,old_val/av); } else if mode=2 { - nsp_variable_global_set(varname,old_val/av); + nsp_variable_global_set_br(varname,old_val/av); } else if mode=3 { nsp_dsm_set(varname,old_val/av); @@ -200,10 +200,10 @@ if as_var_max<>-1 { default: if mode<=1 { - nsp_variable_set(target,varname,av); + nsp_variable_set_br(target,varname,av); } else if mode=2 { - nsp_variable_global_set(varname,av); + nsp_variable_global_set_br(varname,av); } else if mode=3 { nsp_dsm_set(varname,av); @@ -213,4 +213,3 @@ if as_var_max<>-1 { end; } - diff --git a/source.gmx/scripts/nsp_get_constant.gml b/source.gmx/scripts/nsp_get_constant.gml index c9e4271..3cc12c9 100644 --- a/source.gmx/scripts/nsp_get_constant.gml +++ b/source.gmx/scripts/nsp_get_constant.gml @@ -4,10 +4,15 @@ Underlying NSP script. Can be changed by user (read NSP Documentation for more i */ var work_str; -work_str=argument0; +work_str = argument0; switch (work_str) begin + //Boolean: + case "true": return true; + + case "false": return false; + //Mouse: case "mb_left": return mb_left; @@ -27,9 +32,6 @@ switch (work_str) begin case "vk_enter": return vk_enter; //If not a defined constant: - default: - return -9999; - break; + default: return -9999; end; - diff --git a/source.gmx/scripts/nsp_get_token_type.gml b/source.gmx/scripts/nsp_get_token_type.gml new file mode 100644 index 0000000..2cb4272 --- /dev/null +++ b/source.gmx/scripts/nsp_get_token_type.gml @@ -0,0 +1,86 @@ +///nsp_get_token_type(Token, Following Token) +/* +Underlying NSP script. +Returns: Type of provided token (-1 if unknown) +*/ +var nspToken=global.nspToken; +var a, token, token_next; + +token = argument0; +token_next = argument1; + + if token == "{" or token == "}" + or token == "(" or token == ")" + or token == "," or token == ";" { + + return NSP_TYPE._symbol; + + } + else if token == nspToken[NSP_TOK.equal] + or token == nspToken[NSP_TOK.unequal] + or token == nspToken[NSP_TOK.larger] + or token == nspToken[NSP_TOK.larger_equal] + or token == nspToken[NSP_TOK.smaller] + or token == nspToken[NSP_TOK.smaller_equal] + or token == nspToken[NSP_TOK._and] + or token == nspToken[NSP_TOK._or] + or token == nspToken[NSP_TOK._xor] + or token == nspToken[NSP_TOK.add] + or token == nspToken[NSP_TOK.subtract] + or token == nspToken[NSP_TOK.multiply] + or token == nspToken[NSP_TOK.divide] + or token == nspToken[NSP_TOK._mod] + or token == nspToken[NSP_TOK._div] + or token == nspToken[NSP_TOK._power] + or token == nspToken[NSP_TOK.assign] { + + return NSP_TYPE._operator; + + } + else if nsp_is_number(token) { + + return NSP_TYPE._number; + + } + else if nsp_is_string(token) { + + return NSP_TYPE._string; + + } + else if nsp_is_special_word(token) { + + return NSP_TYPE._specword; + + } + else if (token_next == "(") { + + return NSP_TYPE._script; + + } + else if nsp_is_asset(token) { + + return NSP_TYPE._asset; + + } + else if nsp_is_dsm(token) { + + return NSP_TYPE._dsm; + + } + else { + + a = nsp_is_variable(token); + + if (a == 1) + return NSP_TYPE._variablesl; + + if (a == 2) + return NSP_TYPE._variablecl; + + if (a == 3) + return NSP_TYPE._variablegl; + + } + + return -1; + diff --git a/source.gmx/scripts/nsp_gm_nom.gml b/source.gmx/scripts/nsp_gm_nom.gml index b532fa9..3098431 100644 --- a/source.gmx/scripts/nsp_gm_nom.gml +++ b/source.gmx/scripts/nsp_gm_nom.gml @@ -16,4 +16,3 @@ end; return true; - diff --git a/source.gmx/scripts/nsp_grid_shift.gml b/source.gmx/scripts/nsp_grid_shift.gml index ed925bf..cbc5b26 100644 --- a/source.gmx/scripts/nsp_grid_shift.gml +++ b/source.gmx/scripts/nsp_grid_shift.gml @@ -5,4 +5,3 @@ NOTE: There will be some excess data at the end of the grid! */ ds_grid_set_grid_region(argument0,argument0,argument2+1,0,ds_grid_width(argument0)-1,1,argument1,0); - diff --git a/source.gmx/scripts/nsp_is_asset.gml b/source.gmx/scripts/nsp_is_asset.gml index 9316405..5f842d6 100644 --- a/source.gmx/scripts/nsp_is_asset.gml +++ b/source.gmx/scripts/nsp_is_asset.gml @@ -9,4 +9,3 @@ if asset_get_type(argument0)<>asset_unknown return false; - diff --git a/source.gmx/scripts/nsp_is_dsm.gml b/source.gmx/scripts/nsp_is_dsm.gml index e5fe736..a9ffaa7 100644 --- a/source.gmx/scripts/nsp_is_dsm.gml +++ b/source.gmx/scripts/nsp_is_dsm.gml @@ -16,4 +16,3 @@ if work_str=nspToken[NSP_TOK.dsm_name] return false; - diff --git a/source.gmx/scripts/nsp_is_equal.gml b/source.gmx/scripts/nsp_is_equal.gml index f0022e9..ee79d30 100644 --- a/source.gmx/scripts/nsp_is_equal.gml +++ b/source.gmx/scripts/nsp_is_equal.gml @@ -9,4 +9,3 @@ if (is_string(argument0) + is_string(argument1)) <> 1 return false; - diff --git a/source.gmx/scripts/nsp_is_number.gml b/source.gmx/scripts/nsp_is_number.gml index 287ab6f..67b4b38 100644 --- a/source.gmx/scripts/nsp_is_number.gml +++ b/source.gmx/scripts/nsp_is_number.gml @@ -21,4 +21,3 @@ end; return true; - diff --git a/source.gmx/scripts/nsp_is_script.gml b/source.gmx/scripts/nsp_is_script.gml index 11cb7dc..1123295 100644 --- a/source.gmx/scripts/nsp_is_script.gml +++ b/source.gmx/scripts/nsp_is_script.gml @@ -39,4 +39,3 @@ for (i=a; i<=string_length(work_str); i+=1) begin } end; - diff --git a/source.gmx/scripts/nsp_is_special_word.gml b/source.gmx/scripts/nsp_is_special_word.gml index 2662068..ad51a42 100644 --- a/source.gmx/scripts/nsp_is_special_word.gml +++ b/source.gmx/scripts/nsp_is_special_word.gml @@ -14,6 +14,8 @@ switch (argument0) begin case "repeat": return true; case "if": return true; + + case "else": return true; case "while": return true; @@ -21,8 +23,9 @@ switch (argument0) begin case "end": return true; + case "return": return true; + default: return false; end; - diff --git a/source.gmx/scripts/nsp_is_string.gml b/source.gmx/scripts/nsp_is_string.gml index cfd69f9..6270750 100644 --- a/source.gmx/scripts/nsp_is_string.gml +++ b/source.gmx/scripts/nsp_is_string.gml @@ -7,9 +7,8 @@ var q; q=nspToken[NSP_TOK.quote]; -if string_copy(argument0,1,1)=q and string_copy(argument0,string_length(argument0),1)=q +if string_copy(argument0,1,1)==q and string_copy(argument0,string_length(argument0),1)==q && string_pos(q,nsp_string_crop_ext(argument0,q))=0 return true else return false; - diff --git a/source.gmx/scripts/nsp_is_variable.gml b/source.gmx/scripts/nsp_is_variable.gml index 713b55f..e715305 100644 --- a/source.gmx/scripts/nsp_is_variable.gml +++ b/source.gmx/scripts/nsp_is_variable.gml @@ -58,4 +58,3 @@ or nsp_is_script(temp_str) //Default: return 0; - diff --git a/source.gmx/scripts/nsp_list_remove.gml b/source.gmx/scripts/nsp_list_remove.gml index ba62887..992e387 100644 --- a/source.gmx/scripts/nsp_list_remove.gml +++ b/source.gmx/scripts/nsp_list_remove.gml @@ -1,16 +1,15 @@ -///nsp_list_remove(Start, End) +///nsp_list_remove(Start, End, StrList, ParList) /* Underlying NSP script. */ -var nspListStr=global.nspListStr, - nspListPar=global.nspListPar; +var nspListStr = argument2, + nspListPar = argument3; var s,e; -s=argument0; -e=argument1; +s = argument0; +e = argument1; repeat (e+1-s) { - ds_list_delete(nspListStr,s); - ds_list_delete(nspListPar,s); + ds_list_delete(nspListStr, s); + ds_list_delete(nspListPar, s); } - diff --git a/source.gmx/scripts/nsp_list_set_types.gml b/source.gmx/scripts/nsp_list_set_types.gml new file mode 100644 index 0000000..42eb791 --- /dev/null +++ b/source.gmx/scripts/nsp_list_set_types.gml @@ -0,0 +1,33 @@ +///nsp_list_set_types(Token List, Types List) +/* +Underlying NSP script. +Returns: 1 = Success, 0 = Failure +*/ +var i, a, tok_list, typ_list; + +tok_list = argument0; +typ_list = argument1; + +for (i = 0; i < ds_list_size(tok_list)-1; i += 1) { + + a = nsp_get_token_type(tok_list[|i], tok_list[|i+1]); + + //DEBUG: + //show_message("Type of | "+tok_list[|i]+" | = "+nsp_type_name(a)); + + if (a == -1) return 0; + + ds_list_add(typ_list, a); + + } + +a = nsp_get_token_type(tok_list[|i], ""); + +//DEBUG: +//show_message("Type of | "+tok_list[|i]+" | = "+nsp_type_name(a)); + +if (a == -1) return 0; + +ds_list_add(typ_list, a); + +return 1; diff --git a/source.gmx/scripts/nsp_list_tidy_and_verify.gml b/source.gmx/scripts/nsp_list_tidy_and_verify.gml new file mode 100644 index 0000000..5899d0c --- /dev/null +++ b/source.gmx/scripts/nsp_list_tidy_and_verify.gml @@ -0,0 +1,156 @@ +///nsp_list_tidy_and_verify(Token List, Param List) +/* + +Returns: 1 = Success, 0 = Failure + +*/ +var nspToken = global.nspToken; +var a, tok_list, typ_list; +var i, last; + +tok_list = argument0; +typ_list = argument1; + +last = ds_list_size(tok_list)-1; +i = last; + +while (i >= 0) { + + //DEBUG: + //show_message(tok_list[|i]+" | i = "+string(i)); + + switch (typ_list[|i]) { + + case NSP_TYPE._operator: + + //Operator at beginning or end: + if ((i == 0 and tok_list[|i] != "-" and tok_list[|i] != "+") or i == last) { + + NSP_notify("SCRIPT: nsp_list_tidy_and_verify. ERROR: Misplaced operator found at beginning or end of string."); + return 0; + + } + + //Fix unary minuses: + if (tok_list[|i] == "-") { + + if ((nsp_type_is_a_value(typ_list[|i+1]) or tok_list[|i+1] == "(" ) and + (i==0 or (!nsp_type_is_a_value(typ_list[|i-1]) and tok_list[|i-1] != ")"))) { + + //Replace unary minus with " -1 * " + + tok_list[|i] = "-1"; + typ_list[|i] = NSP_TYPE._number; + + ds_list_insert(tok_list, i+1, "*"); + ds_list_insert(typ_list, i+1, NSP_TYPE._operator); + + last += 1; + + } + + i -= 1; + continue; + + } + + //Fix unary pluses: + if (tok_list[|i] == "+") { + + if ((nsp_type_is_a_value(typ_list[|i+1]) or tok_list[|i+1] == "(" ) //Condition 1: Right-hand token is a value-type + and (i==0 or !(nsp_type_is_a_value(typ_list[|i-1]) or tok_list[|i-1] == ")"))) //Condition 2: Left hand token is not a value-type + { + + //Just delete the useless plus + ds_list_delete(tok_list, i); + ds_list_delete(typ_list, i); + last -= 1; + + } + + i -= 1; + continue; + + } + + //Operator at the beginning of string: + if (i == 0) { + + NSP_notify("SCRIPT: nsp_list_tidy_and_verify. ERROR: Misplaced operator found at the beginning of the input string."); + return 0; + + } + + //Operator next to another operator: + if (typ_list[|i-1] == NSP_TYPE._operator or typ_list[|i+1] == NSP_TYPE._operator) { + + //Ignore compound assignment operators: + if (tok_list[|i] == nspToken[NSP_TOK.assign] and typ_list[|i-1] == NSP_TYPE._operator and typ_list[|i+1] != NSP_TYPE._operator) { + + if (tok_list[|i-1] == nspToken[NSP_TOK.add] or + tok_list[|i-1] == nspToken[NSP_TOK.subtract] or + tok_list[|i-1] == nspToken[NSP_TOK.multiply] or + tok_list[|i-1] == nspToken[NSP_TOK.divide]) { + + i -= 2; + continue; + + } + + } + + NSP_notify("SCRIPT: nsp_list_tidy_and_verify. ERROR: Misplaced operator found at beginning or end of string or next to another operator."); + return 0; + + } + + //Operator after non-value: + if (!nsp_type_is_a_value(typ_list[|i-1])) { + + if (tok_list[|i-1] == ")") { + + i-= 1; + continue; + + } + + NSP_notify("SCRIPT: nsp_list_tidy_and_verify. ERROR: Misplaced operator found after a symbol or keyword."); + return 0; + + } + + //No problem found: + i -= 1; + + break; + + case NSP_TYPE._symbol: + + //Add a semicolon after a closed curly bracket to prevent crashes: + if (tok_list[|i] == "}" and i!= last and tok_list[|i+1] != ";") { + + ds_list_insert(tok_list, i+1, ";"); + ds_list_insert(typ_list, i+1, NSP_TYPE._symbol); + + last += 1; + + i-=1; + continue; + + } + + //No problems found: + i -= 1; + + break; + + default: + i -= 1; + continue; + break; + + } + + } + +return 1; diff --git a/source.gmx/scripts/nsp_list_to_string.gml b/source.gmx/scripts/nsp_list_to_string.gml index ced1b71..bdafe97 100644 --- a/source.gmx/scripts/nsp_list_to_string.gml +++ b/source.gmx/scripts/nsp_list_to_string.gml @@ -13,4 +13,3 @@ for (i=argument1; i<=argument2; i+=1) begin end; return s; - diff --git a/source.gmx/scripts/nsp_src_token.gml b/source.gmx/scripts/nsp_src_token.gml index 2cef4be..17f73e7 100644 --- a/source.gmx/scripts/nsp_src_token.gml +++ b/source.gmx/scripts/nsp_src_token.gml @@ -5,4 +5,3 @@ Underlying NSP script. var nspToken=global.nspToken; return string_copy(argument0,argument1,string_length(nspToken[argument2]))==nspToken[argument2]; - diff --git a/source.gmx/scripts/nsp_statement_positions.gml b/source.gmx/scripts/nsp_statement_positions.gml index d81f881..0c82758 100644 --- a/source.gmx/scripts/nsp_statement_positions.gml +++ b/source.gmx/scripts/nsp_statement_positions.gml @@ -1,9 +1,9 @@ -///nsp_statement_positions(Start, End, Statement) +///nsp_statement_positions(Start, End, Statement, StrList) /* Underlying NSP script. */ -var nspListStr=global.nspListStr, - nspToken=global.nspToken; +var nspListStr = argument3, + nspToken = global.nspToken; var a,i,pos_1,pos_2,pos_3,list_min,list_max; //Set up: @@ -70,4 +70,3 @@ a[1]=pos_2; a[2]=pos_3; return a; - diff --git a/source.gmx/scripts/nsp_string_crop.gml b/source.gmx/scripts/nsp_string_crop.gml index 1ac07b0..2c9a4cd 100644 --- a/source.gmx/scripts/nsp_string_crop.gml +++ b/source.gmx/scripts/nsp_string_crop.gml @@ -23,4 +23,3 @@ while (string_copy(work_str,string_length(work_str)-string_length(cond_str)+1,st return work_str; - diff --git a/source.gmx/scripts/nsp_string_crop_ext.gml b/source.gmx/scripts/nsp_string_crop_ext.gml index 55fa375..82df900 100644 --- a/source.gmx/scripts/nsp_string_crop_ext.gml +++ b/source.gmx/scripts/nsp_string_crop_ext.gml @@ -23,4 +23,3 @@ while (string_copy(work_str,string_length(work_str)-string_length(cond_str)+1,st return work_str; - diff --git a/source.gmx/scripts/nsp_string_find_last.gml b/source.gmx/scripts/nsp_string_find_last.gml index 91b128e..1f0054a 100644 --- a/source.gmx/scripts/nsp_string_find_last.gml +++ b/source.gmx/scripts/nsp_string_find_last.gml @@ -19,4 +19,3 @@ end; return t; - diff --git a/source.gmx/scripts/nsp_string_force.gml b/source.gmx/scripts/nsp_string_force.gml index 232ed31..c44ada6 100644 --- a/source.gmx/scripts/nsp_string_force.gml +++ b/source.gmx/scripts/nsp_string_force.gml @@ -8,4 +8,3 @@ if is_string(argument0) return string(argument0); - diff --git a/source.gmx/scripts/nsp_token_is_valid.gml b/source.gmx/scripts/nsp_token_is_valid.gml index ffe1fb5..e4a78f8 100644 --- a/source.gmx/scripts/nsp_token_is_valid.gml +++ b/source.gmx/scripts/nsp_token_is_valid.gml @@ -2,17 +2,25 @@ /* Underlying NSP script. */ -var char1,char2; +var ord1, ord2; -if string_letters(argument0)<>argument0 return true; +if (string_letters(argument0) != argument0) return true; -char1=string_copy(argument1,1,1); -char2=string_copy(argument1,string_length(argument1),1); +ord1 = ord( string_copy(argument1,1,1) ); +ord2 = ord( string_copy(argument1,string_length(argument1),1) ); -if string_letters(char1)<>char1 && - string_letters(char2)<>char2 - return true; - -return false; +// 65 - 90 Letters +// 97 - 122 Letters +// 48 - 57 Digits +// 95 Underscore + +if ((ord1 >= 65 and ord1 <= 90) or (ord1 >= 97 and ord1 <= 122) + or (ord1 == 95)) + return false; +if ((ord2 >= 65 and ord2 <= 90) or (ord2 >= 97 and ord2 <= 122) + or (ord2 == 95) or (ord2 >= 48 and ord2 <= 57)) + return false; + +return true; diff --git a/source.gmx/scripts/nsp_tokenize.gml b/source.gmx/scripts/nsp_tokenize.gml new file mode 100644 index 0000000..e884781 --- /dev/null +++ b/source.gmx/scripts/nsp_tokenize.gml @@ -0,0 +1,224 @@ +///nsp_tokenize(String, Token List) +/* +Underlying NSP script. +Returns: 1 = Success, 0 = Failure +*/ +var i, work_str, pri_q, token, tokenArray, list; +var copy_1, copy_2, copy_3; + +//Setup: +work_str = argument0; +list = argument1; + +tokenArray = global.nspToken; + +work_str = nsp_string_crop(work_str); + +//*** TOKENIZATION LOOP *** +while (string_length(work_str) > 0) { + + pri_q = 1; + token = ""; + + for (i = 1; i <= string_length(work_str); i += 1) begin + + copy_1=string_copy(work_str,i,1); + copy_2=string_copy(work_str,i,2); + copy_3=string_copy(work_str,i,3); + + if string_copy(work_str,i,1)=tokenArray[NSP_TOK.quote] + pri_q*=-1; + + //Check for tokens: + if (pri_q==1) { + + //Whitespace: + if (copy_1)=" " { + if i<>1 { + ds_list_add(list,string_copy(work_str,1,i-1)); + work_str=string_delete(work_str,1,i); + break; + } + + } + //Complex locals: + else if (copy_1=".") { + if i<>1 and string_digits(string_copy(work_str,i+1,1))<>string_copy(work_str,i+1,1) { + ds_list_add(list,string_copy(work_str,1,i-1)); + work_str=string_delete(work_str,1,i-1); + break; + } + + } + //Default tokens: + else if ( copy_1="{" + or copy_1="}" + or copy_1="(" + or copy_1=")" + or copy_1=";" + or copy_1="," ) { + + token=copy_1; + + if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); + ds_list_add(list,token); + work_str=string_delete(work_str,1,i); + break; + + } + //Tokens of length 3: + else if ( copy_3=tokenArray[NSP_TOK.multiply] + or copy_3=tokenArray[NSP_TOK.divide] + or copy_3=tokenArray[NSP_TOK._div] + or copy_3=tokenArray[NSP_TOK._mod] + or copy_3=tokenArray[NSP_TOK._power] + or copy_3=tokenArray[NSP_TOK.add] + or copy_3=tokenArray[NSP_TOK.subtract] + or copy_3=tokenArray[NSP_TOK.equal] + or copy_3=tokenArray[NSP_TOK.larger] + or copy_3=tokenArray[NSP_TOK.larger_equal] + or copy_3=tokenArray[NSP_TOK.smaller] + or copy_3=tokenArray[NSP_TOK.smaller_equal] + or copy_3=tokenArray[NSP_TOK.unequal] + or copy_3=tokenArray[NSP_TOK._and] + or copy_3=tokenArray[NSP_TOK._or] + or copy_3=tokenArray[NSP_TOK._xor] + or copy_3=tokenArray[NSP_TOK.assign] ) { + + token=copy_3; + if nsp_token_is_valid(token,string_copy(work_str,i-1,3+2)) { + + if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); + ds_list_add(list,token); + work_str=string_delete(work_str,1,i+2); + break; + + } + + } + //Tokens of length 2: + else if ( copy_2=tokenArray[NSP_TOK.multiply] + or copy_2=tokenArray[NSP_TOK.divide] + or copy_2=tokenArray[NSP_TOK._div] + or copy_2=tokenArray[NSP_TOK._mod] + or copy_2=tokenArray[NSP_TOK._power] + or copy_2=tokenArray[NSP_TOK.add] + or copy_2=tokenArray[NSP_TOK.subtract] + or copy_2=tokenArray[NSP_TOK.equal] + or copy_2=tokenArray[NSP_TOK.larger] + or copy_2=tokenArray[NSP_TOK.larger_equal] + or copy_2=tokenArray[NSP_TOK.smaller] + or copy_2=tokenArray[NSP_TOK.smaller_equal] + or copy_2=tokenArray[NSP_TOK.unequal] + or copy_2=tokenArray[NSP_TOK._and] + or copy_2=tokenArray[NSP_TOK._or] + or copy_2=tokenArray[NSP_TOK._xor] + or copy_2=tokenArray[NSP_TOK.assign] ) { + + token=copy_2; + if nsp_token_is_valid(token,string_copy(work_str,i-1,2+2)) { + + if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); + ds_list_add(list,token); + work_str=string_delete(work_str,1,i+1); + break; + + } + + } + //Tokens of length 1: + else if ( copy_1=tokenArray[NSP_TOK.multiply] + or copy_1=tokenArray[NSP_TOK.divide] + or copy_1=tokenArray[NSP_TOK._div] + or copy_1=tokenArray[NSP_TOK._mod] + or copy_1=tokenArray[NSP_TOK._power] + or copy_1=tokenArray[NSP_TOK.add] + or copy_1=tokenArray[NSP_TOK.subtract] + or copy_1=tokenArray[NSP_TOK.equal] + or copy_1=tokenArray[NSP_TOK.larger] + or copy_1=tokenArray[NSP_TOK.larger_equal] + or copy_1=tokenArray[NSP_TOK.smaller] + or copy_1=tokenArray[NSP_TOK.smaller_equal] + or copy_1=tokenArray[NSP_TOK.unequal] + or copy_1=tokenArray[NSP_TOK._and] + or copy_1=tokenArray[NSP_TOK._or] + or copy_1=tokenArray[NSP_TOK._xor] + or copy_1=tokenArray[NSP_TOK.assign] ) { + + token=copy_1; + if nsp_token_is_valid(token,string_copy(work_str,i-1,1+2)) { + + if i<>1 ds_list_add(list,string_copy(work_str,1,i-1)); + ds_list_add(list,token); + work_str=string_delete(work_str,1,i); + break; + + } + + } + else if i=string_length(work_str) { + ds_list_add(list,work_str); + work_str=""; + break; + } + + } + + end; + + } + +//*** TIDY UP 1 *** +i = ds_list_size(list)-1; + +while (i >= 0) { + + list[|i] = nsp_string_crop(list[|i]); + + switch (list[|i]) begin + + case "begin": + list[|i] = "{"; + break; + + case "end": + list[|i] = "}"; + break; + + case "global": + if (i != ds_list_size(list)-1) { + + list[|i+1] = "global" + nsp_string_crop(list[|i+1]); + ds_list_delete(list, i); + + } + else + return 0; + break; + + case "": + ds_list_delete(list,i); + break; + + default: + var c; + c = nsp_get_constant(list[|i]); + if (c != -9999) + list[|i] = string(c); + break; + + end; + + i -= 1; + + } + +//DEBUG: +//show_message("Input string: "+argument0); +//show_message("Tokenized string: "+nsp_list_to_string(list, 0, ds_list_size(list)-1, " | ")); + +return 1; + + + + diff --git a/source.gmx/scripts/nsp_type_is_a_value.gml b/source.gmx/scripts/nsp_type_is_a_value.gml new file mode 100644 index 0000000..c95b337 --- /dev/null +++ b/source.gmx/scripts/nsp_type_is_a_value.gml @@ -0,0 +1,19 @@ +///nsp_type_is_a_value(Type) +/* + +*/ +var type; + +type = argument[0]; + +if (type == NSP_TYPE._number or + type == NSP_TYPE._string or + type == NSP_TYPE._script or + type == NSP_TYPE._asset or + type == NSP_TYPE._variablesl or + type == NSP_TYPE._variablecl or + type == NSP_TYPE._variablegl or + type == NSP_TYPE._dsm) + return 1; + +return 0; diff --git a/source.gmx/scripts/nsp_type_name.gml b/source.gmx/scripts/nsp_type_name.gml new file mode 100644 index 0000000..f3f4af8 --- /dev/null +++ b/source.gmx/scripts/nsp_type_name.gml @@ -0,0 +1,35 @@ +///nsp_type_name(Type) +/* + +*/ +var type; + +type = argument[0]; + +switch (type) { + + case NSP_TYPE._symbol: return "symbol"; + + case NSP_TYPE._operator: return "operator"; + + case NSP_TYPE._number: return "number"; + + case NSP_TYPE._string: return "string"; + + case NSP_TYPE._script: return "script (function)"; + + case NSP_TYPE._asset: return "asset"; + + case NSP_TYPE._variablesl: return "variable (sl)"; + + case NSP_TYPE._variablecl: return "variable (cl)"; + + case NSP_TYPE._variablegl: return "variable (gl)"; + + case NSP_TYPE._dsm: return "dsm"; + + case NSP_TYPE._specword: return "specword"; + + default: return "unknown"; + + } diff --git a/source.gmx/scripts/nsp_variable_get.gml b/source.gmx/scripts/nsp_variable_get.gml index c560c1f..ee610dc 100644 --- a/source.gmx/scripts/nsp_variable_get.gml +++ b/source.gmx/scripts/nsp_variable_get.gml @@ -11,10 +11,6 @@ if !instance_exists(argument0) { switch (argument1) begin - case "id": - return (argument0).id; - break; - case "x": return (argument0).x; break; @@ -22,94 +18,8 @@ switch (argument1) begin case "y": return (argument0).y; break; - - case "xstart": - return (argument0).xstart; - break; - - case "ystart": - return (argument0).ystart; - break; - - case "a": - return (argument0).a; - break; - - case "b": - return (argument0).b; - break; - case "c": - return (argument0).c; - break; - - case "d": - return (argument0).d; - break; - - case "i": - return (argument0).i; - break; - - case "t": - return (argument0).t; - break; - - case "z": - return (argument0).z; - break; - - case "counter": - return (argument0).counter; - break; - - case "hspeed": - return (argument0).hspeed; - break; - - case "vspeed": - return (argument0).vspeed; - break; - - case "speed": - return (argument0).speed; - break; - - case "direction": - return (argument0).direction; - break; - - case "image_angle": - return (argument0).image_angle; - break; - - case "image_index": - return (argument0).image_index; - break; - - case "image_speed": - return (argument0).image_speed; - break; - - case "sprite_index": - return (argument0).sprite_index; - break; - - case "object_index": - return (argument0).object_index; - break; - - case "_hspeed": - return (argument0)._hspeed; - break; - - case "_vspeed": - return (argument0)._vspeed; - break; - - case "_health": - return (argument0)._health; - break; + // Add more here... default: NSP_notify("SCRIPT: nsp_variable_get. ERROR: Variable not supported ("+argument1+")."); @@ -118,4 +28,3 @@ switch (argument1) begin end; - diff --git a/source.gmx/scripts/nsp_variable_get_br.gml b/source.gmx/scripts/nsp_variable_get_br.gml new file mode 100644 index 0000000..7a2cd98 --- /dev/null +++ b/source.gmx/scripts/nsp_variable_get_br.gml @@ -0,0 +1,15 @@ +///nsp_variable_get_br(Instance, Variable) +/* +Underlying NSP script. +*/ + +if (NSP_VAR_SYS.new == 1) { + + return nsp_variable_get_new(argument0, argument1); + + } +else { + + return nsp_variable_get(argument0, argument1); + + } diff --git a/source.gmx/scripts/nsp_variable_get_new.gml b/source.gmx/scripts/nsp_variable_get_new.gml new file mode 100644 index 0000000..1057ab9 --- /dev/null +++ b/source.gmx/scripts/nsp_variable_get_new.gml @@ -0,0 +1,39 @@ +///nsp_variable_get_new(Instance, Variable) +/* +Underlying NSP script. +*/ +var nspToken = global.nspToken; +var inst, varname, val; + +inst = argument[0]; +varname = argument[1]; + +//DEBUG: +//show_message("Fetching "+varname+" -> "+nsp_string_force(variable_instance_get(inst, varname))); + +if (inst < 10000) { + + if (instance_number(inst) == 0) { + NSP_notify("SCRIPT: nsp_variable_get_new. ERROR: Trying to reference non-existing instance."); + exit; + } + + inst = instance_find(inst, 0); + + } + +if (!instance_exists(inst)) { + + NSP_notify("SCRIPT: nsp_variable_get_new. ERROR: Trying to reference non-existing instance."); + return nspToken[NSP_TOK.abort]; + + } + +if (!variable_instance_exists(inst, varname)) { + + NSP_notify("SCRIPT: nsp_variable_get_new. ERROR: Trying to fetch a non-existant variable ( "+varname+" )."); + return nspToken[NSP_TOK.abort]; + + } + +return variable_instance_get(inst, varname); diff --git a/source.gmx/scripts/nsp_variable_global_get.gml b/source.gmx/scripts/nsp_variable_global_get.gml index 3b327f7..2052443 100644 --- a/source.gmx/scripts/nsp_variable_global_get.gml +++ b/source.gmx/scripts/nsp_variable_global_get.gml @@ -1,6 +1,6 @@ ///nsp_variable_global_get(Name) /* -Underlying NSP script. Can be changed by user (read NSP Documentation for more info). +Underlying NSP script.. */ var nspToken=global.nspToken; var work_str; @@ -12,33 +12,15 @@ if string_copy(argument0,1,7)="global." switch (work_str) begin - case "score": - return score; + case "room_speed": + return room_speed; break; - case "lives": - return lives; - break; - - case "health": - return health; - break; - - case "mouse_x": - return mouse_x; - break; - - case "mouse_y": - return mouse_y; - break; -/* case "state": return global.state; break; - */ - case "trg": - return global.trg; - break; + + // Add more here... default: NSP_notify("SCRIPT: nsp_variable_global_get. ERROR: Variable not supported ("+argument0+")."); @@ -47,4 +29,3 @@ switch (work_str) begin end; - diff --git a/source.gmx/scripts/nsp_variable_global_get_br.gml b/source.gmx/scripts/nsp_variable_global_get_br.gml new file mode 100644 index 0000000..e3b2863 --- /dev/null +++ b/source.gmx/scripts/nsp_variable_global_get_br.gml @@ -0,0 +1,15 @@ +///nsp_variable_global_get_br(Variable) +/* +Underlying NSP script. +*/ + +if (NSP_VAR_SYS.new == 1) { + + return nsp_variable_global_get_new(argument0); + + } +else { + + return nsp_variable_global_get(argument0); + + } diff --git a/source.gmx/scripts/nsp_variable_global_get_new.gml b/source.gmx/scripts/nsp_variable_global_get_new.gml new file mode 100644 index 0000000..e55ba8e --- /dev/null +++ b/source.gmx/scripts/nsp_variable_global_get_new.gml @@ -0,0 +1,24 @@ +///nsp_variable_global_get_new(Name) +/* +Underlying NSP script. +*/ +var nspToken = global.nspToken; +var varname; + +varname = argument[0]; + +if (string_copy(varname, 1, 7) == "global.") { + + varname = string_delete(varname, 1, 7); + + } + +if (!variable_global_exists(varname)) { + + NSP_notify("SCRIPT: nsp_variable_global_get_new. ERROR: Trying to fetch a non-existant global variable ("+varname+")."); + return nspToken[NSP_TOK.abort]; + + } + +return variable_global_get(varname); + diff --git a/source.gmx/scripts/nsp_variable_global_set.gml b/source.gmx/scripts/nsp_variable_global_set.gml index a1dddb3..7030231 100644 --- a/source.gmx/scripts/nsp_variable_global_set.gml +++ b/source.gmx/scripts/nsp_variable_global_set.gml @@ -1,6 +1,6 @@ ///nsp_variable_global_set(Name, Value) /* -Underlying NSP script. Can be changed by user (read NSP Documentation for more info). +Underlying NSP script. */ var work_str; @@ -16,26 +16,16 @@ if string_copy(argument0,1,7)="global." switch (work_str) begin - case "score": - score=argument1; + case "room_speed": + room_speed = argument1; break; - case "lives": - lives=argument1; - break; - - case "health": - health=argument1; - break; - /* case "state": - global.state=argument1; - break; - */ - case "trg": - global.trg=argument1; + global.state = argument1; break; + // Add more here... + default: NSP_notify("SCRIPT: nsp_variable_global_set. ERROR: Variable not supported ("+argument0+")."); break; diff --git a/source.gmx/scripts/nsp_variable_global_set_br.gml b/source.gmx/scripts/nsp_variable_global_set_br.gml new file mode 100644 index 0000000..6d34d08 --- /dev/null +++ b/source.gmx/scripts/nsp_variable_global_set_br.gml @@ -0,0 +1,15 @@ +///nsp_variable_global_set_br(Variable, Value) +/* +Underlying NSP script. +*/ + +if (NSP_VAR_SYS.new == 1) { + + nsp_variable_global_set_new(argument0, argument1); + + } +else { + + nsp_variable_global_set(argument0, argument1); + + } diff --git a/source.gmx/scripts/nsp_variable_global_set_new.gml b/source.gmx/scripts/nsp_variable_global_set_new.gml new file mode 100644 index 0000000..f953107 --- /dev/null +++ b/source.gmx/scripts/nsp_variable_global_set_new.gml @@ -0,0 +1,23 @@ +///nsp_variable_global_set_new(Name, Value) +/* +Underlying NSP script. +*/ +var varname, val; + +varname = argument[0]; +val = argument[1]; + +if (is_string(val) and nsp_is_string(val)) { + + val = string_copy(val, 2, string_length(val)-2); + + } + +if (string_copy(varname, 1, 7) == "global.") { + + varname=string_delete(varname, 1, 7); + + } + +variable_global_set(varname, val); + diff --git a/source.gmx/scripts/nsp_variable_set.gml b/source.gmx/scripts/nsp_variable_set.gml index 746471c..389ff24 100644 --- a/source.gmx/scripts/nsp_variable_set.gml +++ b/source.gmx/scripts/nsp_variable_set.gml @@ -14,96 +14,15 @@ if is_string(argument2) { switch (argument1) begin - case "id": - (argument0).id=argument2; - break; - case "x": - (argument0).x=argument2; + (argument0).x = argument2; break; case "y": - (argument0).y=argument2; - break; - - case "a": - (argument0).a=argument2; - break; - - case "b": - (argument0).b=argument2; - break; - - case "c": - (argument0).c=argument2; - break; - - case "d": - (argument0).d=argument2; - break; - - case "i": - (argument0).i=argument2; - break; - - case "t": - (argument0).t=argument2; - break; - - case "z": - (argument0).z=argument2; - break; - - case "counter": - (argument0).counter=argument2; - break; - - case "hspeed": - (argument0).hspeed=argument2; - break; - - case "vspeed": - (argument0).vspeed=argument2; - break; - - case "speed": - (argument0).speed=argument2; - break; - - case "direction": - (argument0).direction=argument2; + (argument0).y = argument2; break; - case "image_angle": - (argument0).image_angle=argument2; - break; - - case "image_index": - (argument0).image_index=argument2; - break; - - case "image_speed": - (argument0).image_speed=argument2; - break; - - case "sprite_index": - (argument0).sprite_index=argument2; - break; - - //case "object_index": - // break; - - case "_hspeed": - (argument0)._hspeed=argument2; - break; - - case "_vspeed": - (argument0)._vspeed=argument2; - break; - - case "_health": - (argument0)._health=argument2; - break; + // Add more here... default: NSP_notify("SCRIPT: nsp_variable_set. ERROR: Variable not supported ("+argument1+")."); @@ -112,4 +31,3 @@ switch (argument1) begin end; - diff --git a/source.gmx/scripts/nsp_variable_set_br.gml b/source.gmx/scripts/nsp_variable_set_br.gml new file mode 100644 index 0000000..6a2fd79 --- /dev/null +++ b/source.gmx/scripts/nsp_variable_set_br.gml @@ -0,0 +1,17 @@ +///nsp_variable_set_br(Instance, Variable, Value) +/* +Underlying NSP script. +*/ + +if (NSP_VAR_SYS.new == 1) { + + nsp_variable_set_new(argument0, argument1, argument2); + + } +else { + + nsp_variable_set(argument0, argument1, argument2); + + } + + diff --git a/source.gmx/scripts/nsp_variable_set_new.gml b/source.gmx/scripts/nsp_variable_set_new.gml new file mode 100644 index 0000000..7f25146 --- /dev/null +++ b/source.gmx/scripts/nsp_variable_set_new.gml @@ -0,0 +1,39 @@ +///nsp_variable_set_new(Instance, Variable, Value) +/* +Underlying NSP script. +*/ +var inst, varname, val; + +inst = argument[0]; +varname = argument[1]; +val = argument[2]; + +//DEBUG: +//show_message("Setting "+varname+" to "+nsp_string_force(val)); + +if (inst < 10000) { + + if (instance_number(inst) == 0) { + NSP_notify("SCRIPT: nsp_variable_set_new. ERROR: Trying to reference non-existing instance."); + exit; + } + + inst = instance_find(inst, 0); + + } + +if (!instance_exists(inst)) { + + NSP_notify("SCRIPT: nsp_variable_set_new. ERROR: Trying to reference non-existing instance."); + exit; + + } + +if (is_string(val) and nsp_is_string(val)) { + + val = string_copy(val, 2, string_length(val)-2); + + } + +variable_instance_set(inst, varname, val); + diff --git a/source.gmx/scripts/objectInPalette.gml.bak b/source.gmx/scripts/objectInPalette.gml.bak new file mode 100644 index 0000000..5f97a2c --- /dev/null +++ b/source.gmx/scripts/objectInPalette.gml.bak @@ -0,0 +1,41 @@ +// Returns whether or not an object is a special palette object. +// Mainly used in oEdit to differentiate objects placed by the user +// from other misc objects. + +var objectindex = argument0 + +switch objectindex { + case oSpikeUp: + case oSpikeRight: + case oSpikeLeft: + case oSpikeDown: + case oMiniSpikeUp: + case oMiniSpikeRight: + case oMiniSpikeLeft: + case oMiniSpikeDown: + case oEditBlock: + case oEditMiniBlock: + case oApple: + case oSave: + case oPlatform: + case oKillerBlock: + case oWater: + case oWater2: + case oWater3: + case oWalljumpL: + case oWalljumpR: + case oBulletBlocker: + case oPlayerStart: + case oWarp: + case oJumpRefresher: + case oGravityArrowUp: + case oGravityArrowDown: + case oSaveFlip: +<<<<<<< HEAD:jtool.gmx/scripts/objectInPalette.gml +======= + case oTrg: + case oMiniKillerBlock: +>>>>>>> upstream/master:source.gmx/scripts/objectInPalette.gml + return true +} +return false diff --git a/source.gmx/scripts/saveConfig.gml b/source.gmx/scripts/saveConfig.gml index 22451be..726b7b6 100644 --- a/source.gmx/scripts/saveConfig.gml +++ b/source.gmx/scripts/saveConfig.gml @@ -7,20 +7,21 @@ for (var i=0; i= maxpos or y >= maxpos or x < minpos or y < minpos { @@ -54,7 +54,7 @@ with all { } var saveid = objectToSaveID(object_index) if saveid != -1 { - FS_file_text_write_string(f,intToBase32String(saveid) + file_text_write_string(f,intToBase32String(saveid) +padStringLeft(intToBase32String(x+128),2,'0')) saved = true } @@ -65,12 +65,12 @@ with all { } // secondary data -FS_file_text_writeln(f) -FS_file_text_writeln(f) -FS_file_text_write_string(f,'data repeated below for easy parsing by other tools') -FS_file_text_writeln(f) -FS_file_text_write_string(f,'objects: (x, y, type)') -FS_file_text_writeln(f) +file_text_writeln(f) +file_text_writeln(f) +file_text_write_string(f,'data repeated below for easy parsing by other tools') +file_text_writeln(f) +file_text_write_string(f,'objects: (x, y, type)') +file_text_writeln(f) with all { if not objectInPalette(object_index) continue var maxpos = 896 @@ -79,27 +79,27 @@ with all { objects_out_of_range = true continue } - FS_file_text_write_string(f,string(x)+' '+string(y)+' '+string(objectToSaveID(object_index))+' ') + file_text_write_string(f,string(x)+' '+string(y)+' '+string(objectToSaveID(object_index))+' ') } -FS_file_text_writeln(f) -FS_file_text_write_string(f, 'version:'+global.version_string) -FS_file_text_writeln(f) -FS_file_text_write_string(f, 'infinitejump:'+string(global.infinitejump)) -FS_file_text_writeln(f) -FS_file_text_write_string(f, 'dotkid:'+string(global.dotkid)) -FS_file_text_writeln(f) -FS_file_text_write_string(f, 'savetype:'+string(global.savetype)) -FS_file_text_writeln(f) -FS_file_text_write_string(f, 'bordertype:'+string(global.bordertype)) -FS_file_text_writeln(f) -FS_file_text_write_string(f, 'playersavex:'+string(global.savePlayerX)) -FS_file_text_writeln(f) -FS_file_text_write_string(f, 'playersavey:'+string_format(global.savePlayerY,3,16)) -FS_file_text_writeln(f) -FS_file_text_write_string(f, 'playersavexscale:'+string(global.savePlayerXScale)) -FS_file_text_writeln(f) +file_text_writeln(f) +file_text_write_string(f, 'version:'+global.version_string) +file_text_writeln(f) +file_text_write_string(f, 'infinitejump:'+string(global.infinitejump)) +file_text_writeln(f) +file_text_write_string(f, 'dotkid:'+string(global.dotkid)) +file_text_writeln(f) +file_text_write_string(f, 'savetype:'+string(global.savetype)) +file_text_writeln(f) +file_text_write_string(f, 'bordertype:'+string(global.bordertype)) +file_text_writeln(f) +file_text_write_string(f, 'playersavex:'+string(global.savePlayerX)) +file_text_writeln(f) +file_text_write_string(f, 'playersavey:'+string_format(global.savePlayerY,3,16)) +file_text_writeln(f) +file_text_write_string(f, 'playersavexscale:'+string(global.savePlayerXScale)) +file_text_writeln(f) -FS_file_text_close(f) +file_text_close(f) // warning messages for oob or unrecognized objects var warning_message = '' diff --git a/source.gmx/scripts/saveRMJMap.gml b/source.gmx/scripts/saveRMJMap.gml index 86df1cb..fdb8569 100644 --- a/source.gmx/scripts/saveRMJMap.gml +++ b/source.gmx/scripts/saveRMJMap.gml @@ -4,13 +4,13 @@ filename = get_save_filename_ext('RMJ map|*.map','','','Save RMJ Map') if filename == '' exit // header -var f = FS_file_text_open_write(filename) -FS_file_text_write_string(f,' 1.030000') -FS_file_text_writeln(f) -FS_file_text_write_string(f,'Imported from jtool '+global.version_string) -FS_file_text_writeln(f) -FS_file_text_write_string(f,'someone') -FS_file_text_writeln(f) +var f = file_text_open_write(filename) +file_text_write_string(f,' 1.030000') +file_text_writeln(f) +file_text_write_string(f,'Imported from jtool '+global.version_string) +file_text_writeln(f) +file_text_write_string(f,'someone') +file_text_writeln(f) // objects var non_rmj_object = false @@ -20,9 +20,9 @@ with all { if objectInPalette(object_index) non_rmj_object = true continue } - FS_file_text_write_string(f,' '+string(x)+' '+string(y)+' '+string(rmjcode)) + file_text_write_string(f,' '+string(x)+' '+string(y)+' '+string(rmjcode)) } -FS_file_text_close(f) +file_text_close(f) if non_rmj_object { inputOverlay(input_info,false,"Warning: Some objects aren't supported by RMJ and weren't saved.") diff --git a/source.gmx/scripts/string_remove_whitespace.gml b/source.gmx/scripts/string_remove_whitespace.gml new file mode 100644 index 0000000..b15084d --- /dev/null +++ b/source.gmx/scripts/string_remove_whitespace.gml @@ -0,0 +1,38 @@ +/// string_remove_whitespace(str [, sub]) +// +// Consolidates and removes all whitespace from a string, +// optionally replacing it with a character or string. +// Whitespace is defined as SPACE, HT, LF, VT, FF, CR. +// +// str text to be processed, string +// sub whitespace substitution, string (optional) +// +/// GMLscripts.com/license +{ + var str, sub="", wsp, len, i, o, out=""; + + str = argument[0]; + if (argument_count > 1) sub = argument[1]; + + wsp = false; + len = string_length(str); + + for (i=1; i<=len; i+=1) + { + o = string_ord_at(str, i); + if ((o > 8) && (o < 14) || (o == 32)) + { + wsp = true; + continue; + } + if (wsp) + { + out += sub; + wsp = false; + } + out += chr(o); + } + if (wsp) out += sub; + + return out; +} diff --git a/source.gmx/sound/sndDJump.sound.gmx b/source.gmx/sound/sndDJump.sound.gmx index 4795480..cabb4f7 100644 --- a/source.gmx/sound/sndDJump.sound.gmx +++ b/source.gmx/sound/sndDJump.sound.gmx @@ -15,7 +15,7 @@ 44100 - 0 + 1 16 diff --git a/source.gmx/sound/sndJump.sound.gmx b/source.gmx/sound/sndJump.sound.gmx index d11672e..82248cd 100644 --- a/source.gmx/sound/sndJump.sound.gmx +++ b/source.gmx/sound/sndJump.sound.gmx @@ -15,7 +15,7 @@ 44100 - 0 + 1 16 diff --git a/source.gmx/sound/sndShoot.sound.gmx b/source.gmx/sound/sndShoot.sound.gmx index 7a38926..cbe08a2 100644 --- a/source.gmx/sound/sndShoot.sound.gmx +++ b/source.gmx/sound/sndShoot.sound.gmx @@ -15,7 +15,7 @@ 44100 - 0 + 1 16 diff --git a/source.gmx/sound/sndWallJump.sound.gmx b/source.gmx/sound/sndWallJump.sound.gmx index d219877..80e4478 100644 --- a/source.gmx/sound/sndWallJump.sound.gmx +++ b/source.gmx/sound/sndWallJump.sound.gmx @@ -15,7 +15,7 @@ 44100 - 0 + 1 16 diff --git a/source.gmx/source.project.gmx b/source.gmx/source.project.gmx index d85b1f1..2e393cf 100644 --- a/source.gmx/source.project.gmx +++ b/source.gmx/source.project.gmx @@ -3,11 +3,11 @@ Configs\Default - + - extensions\GMFileSystem - extensions\exPatchWindowClose - extensions\CleanMemEx + extensions\libjtool + extensions\window_command_hook + extensions\N String Parser 2 sound\sndJump @@ -287,41 +287,102 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -329,18 +390,27 @@ - - - + + + + + + + + + + + + @@ -353,37 +423,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - shaders\shdSingleColor.shader @@ -483,7 +522,6 @@ rooms\rMain - rooms\rm_sample_ex_patch_windowclose 1 diff --git a/source.gmx/source.project.gmx.bak b/source.gmx/source.project.gmx.bak new file mode 100644 index 0000000..f04d670 --- /dev/null +++ b/source.gmx/source.project.gmx.bak @@ -0,0 +1,563 @@ + + + + Configs\Default + + + +<<<<<<< HEAD:jtool.gmx/jtool.project.gmx + extensions\libjtool + extensions\window_command_hook + extensions\N String Parser 2 +======= + extensions\GMFileSystem + extensions\exPatchWindowClose + extensions\CleanMemEx +>>>>>>> upstream/master:source.gmx/source.project.gmx + + + sound\sndJump + sound\sndDJump + sound\sndShoot + sound\sndWallJump + + + + sprites\sEditBlock + sprites\sEditMiniBlock + sprites\sSpikeUp + sprites\sSpikeRight + sprites\sSpikeLeft + sprites\sSpikeDown + sprites\sMiniSpikeUp + sprites\sMiniSpikeRight + sprites\sMiniSpikeLeft + sprites\sMiniSpikeDown + sprites\sApple + sprites\sSave + sprites\sPlatform + sprites\sWater1 + sprites\sWater2 + sprites\sWater3 + sprites\sKillerBlock + sprites\sMiniKillerBlock + sprites\sWalljumpL + sprites\sWalljumpR + sprites\sBulletBlocker + sprites\sPlayerStart + sprites\sWarp + sprites\sJumpRefresher + sprites\sSidebar + sprites\sMenu + sprites\sPopup + + + sprites\sPlayerStartDefault + sprites\sEditBlockDefault + sprites\sEditMiniBlockDefault + sprites\sSpikeUpDefault + sprites\sSpikeRightDefault + sprites\sSpikeLeftDefault + sprites\sSpikeDownDefault + sprites\sMiniSpikeUpDefault + sprites\sMiniSpikeRightDefault + sprites\sMiniSpikeLeftDefault + sprites\sMiniSpikeDownDefault + sprites\sAppleDefault + sprites\sSaveDefault + sprites\sPlatformDefault + sprites\sWater1Default + sprites\sWater2Default + sprites\sWater3Default + sprites\sKillerBlockDefault + sprites\sMiniKillerBlockDefault + sprites\sWalljumpLDefault + sprites\sWalljumpRDefault + sprites\sBulletBlockerDefault + sprites\sWarpDefault + sprites\sJumpRefresherDefault + sprites\sSidebarDefault + sprites\sMenuDefault + sprites\sPopupDefault + sprites\sPlayerFallDefault + sprites\sPlayerIdleDefault + sprites\sPlayerJumpDefault + sprites\sPlayerRunningDefault + sprites\sPlayerSlidingDefault + sprites\sPlayerShootDefault + sprites\sPlayerBulletDefault + + + sprites\sPlayerFall + sprites\sPlayerIdle + sprites\sPlayerShoot + sprites\sPlayerJump + sprites\sPlayerRunning + sprites\sPlayerSliding + sprites\sPlayerMask + sprites\sPlayerMaskFlip + sprites\sPlayerBullet + sprites\sPlayerBlood + sprites\sDotkid + sprites\sDotkidOutline + + + sprites\sPlatformMask + sprites\sSaveFlip + sprites\sBlockMask + sprites\sBlockMaskMini + sprites\sBlockMaskSlip + sprites\sPink32 + sprites\sSlideBlockL + sprites\sSlideBlockR + sprites\sGravityArrowUp + sprites\sGravityArrowDown + sprites\sWaterNekoron + + + sprites\sEditorKiller + sprites\sEditorWorld + sprites\sEditorButton + sprites\sEditorPencil + sprites\sEditorBorderDeath + sprites\sEditorMenu + sprites\sEditorKid + sprites\sEditorInputOverlay + sprites\sEditorZoom + sprites\sEditorPalette + + + sprites\sMenuSave + sprites\sMenuOpen + sprites\sMenuDotkid + sprites\sMenuInfJump + sprites\sMenuFullscreen + sprites\sMenuDeath + sprites\sMenuDotOutline + sprites\sMenuHitbox + sprites\sMenuGrid + sprites\sMenuSpeed + sprites\sMenuSidebar + sprites\sMenuSidebar2 + sprites\sMenuSkin + sprites\sMenuSavePoint + sprites\sMenuCoords + sprites\sMenuBorderType + sprites\sMenuDepth + sprites\sMenuClearMap + sprites\sMenuWaterLock + sprites\sMenuWaterLock2 +<<<<<<< HEAD:jtool.gmx/jtool.project.gmx + sprites\sMenuDeathAnim +======= + sprites\sMenuRecord + sprites\sMenuContinue + sprites\sMenuStop + sprites\sMenuEraser +>>>>>>> upstream/master:source.gmx/source.project.gmx + + + sprites\sEditCursor + sprites\sHintCursor + sprites\sBorderDeath + sprites\sCursorDropper + sprites\sCursorCoder + sprites\sCursorClosedHand + sprites\sCursorOpenHand + sprites\sPatBall + sprites\sEllipsis + sprites\sJumpManyTimes + sprites\sIcon32 + sprites\sDepthArrowUp + sprites\sDepthPlayerHint + sprites\sWakahaEasterEgg + + sprites\sprite121 + + + background\bgBackground + background\bgBackgroundDefault + background\bgRecord + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<<<<<<< HEAD:jtool.gmx/jtool.project.gmx + + +======= + + + + + + + + + + + + + + + + +>>>>>>> upstream/master:source.gmx/source.project.gmx + + + shaders\shdSingleColor.shader + + + fonts\font_small + fonts\font_big + + + objects\oPlayer + objects\oPlayerCopy + objects\oRecordPlayer + objects\oRecordPlayerCopy + objects\oPause + objects\oWorld + objects\oMenu + objects\oEdit + objects\oInputOverlay + objects\oZoom + objects\oRecord + objects\oContinue + objects\oPalette + + objects\oEditBlock + objects\oEditMiniBlock + objects\oPlatform + objects\oPlayerStart + objects\oBulletBlocker + objects\oSpikeUp + objects\oSpikeRight + objects\oSpikeLeft + objects\oSpikeDown + objects\oMiniSpikeUp + objects\oMiniSpikeRight + objects\oMiniSpikeLeft + objects\oMiniSpikeDown + objects\oApple + objects\oKillerBlock + objects\oMiniKillerBlock + objects\oWater + objects\oWater2 + objects\oWater3 + objects\oWalljumpL + objects\oWalljumpR + objects\oSave + objects\oWarp + objects\oJumpRefresher + + + objects\oSlipBlock + objects\oWaterNekoron + objects\oSlideBlock + objects\oSlideBlockR + objects\oGravityArrowUp + objects\oGravityArrowDown + objects\oSaveFlip + objects\oPatBall + objects\oTrg + + + objects\oEditorInstructions + objects\oOptionsButton + objects\oGridComboBox + objects\oSpeedComboBox + objects\oHideSidebar + objects\oSidebar + + objects\oDeathDisplay + objects\oJumpDurations + objects\oPlayerPosition + objects\oBhopHint + objects\oCancelHint + objects\oToggleAnalysis + objects\oFpsDisplay + + + + objects\oPlayerBloodEmitter + objects\oPlayerBlood + objects\oPlayerBloodTypeB + objects\oPlayerBloodCharm1 + objects\oPlayerBullet + objects\oBlock + objects\oKiller + + + objects\oBorderDeath + objects\oDrawGrid + objects\oPlayerVictory + objects\oKeySaveParticle + objects\oJumpManyTimes + objects\oPaletteButtonFlash + objects\oDrawCursorCoords + objects\oCreateBalls + objects\oBorderBlock + objects\oBorderTypeController + objects\oDepthOrderPlayerHint + objects\oWakahaEasterEgg + + + + rooms\rMain + + + 1 + 2 + 3 + 1 + 2 + 3 + 4 + 5 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 0 + 1 + 0 + 1 + 0 + 1 + 2 + 3 + + + help.rtf + + + 0 + + 0 + + diff --git a/source.gmx/sprites/images/sMiniKillerBlockDefault_0.png b/source.gmx/sprites/images/sMiniKillerBlockDefault_0.png index 0e9295b..24a534f 100644 Binary files a/source.gmx/sprites/images/sMiniKillerBlockDefault_0.png and b/source.gmx/sprites/images/sMiniKillerBlockDefault_0.png differ diff --git a/source.gmx/sprites/sMiniKillerBlockDefault.sprite.gmx b/source.gmx/sprites/sMiniKillerBlockDefault.sprite.gmx index cde30e6..58f930b 100644 --- a/source.gmx/sprites/sMiniKillerBlockDefault.sprite.gmx +++ b/source.gmx/sprites/sMiniKillerBlockDefault.sprite.gmx @@ -1,24 +1,24 @@ 0 - 1 - 1 + 0 + 0 0 0 -1 0 0 - 0 + 15 0 - 0 + 15 0 0 0 0 - 1 - 1 + 16 + 16 images\sMiniKillerBlockDefault_0.png diff --git a/windowCommandHook/windowCommandHook.sln b/windowCommandHook/windowCommandHook.sln new file mode 100644 index 0000000..262063d --- /dev/null +++ b/windowCommandHook/windowCommandHook.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2027 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "windowCommandHook", "windowCommandHook\windowCommandHook.vcxproj", "{F327EA4C-795E-49E1-832D-1F5E4987D328}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F327EA4C-795E-49E1-832D-1F5E4987D328}.Debug|x64.ActiveCfg = Debug|x64 + {F327EA4C-795E-49E1-832D-1F5E4987D328}.Debug|x64.Build.0 = Debug|x64 + {F327EA4C-795E-49E1-832D-1F5E4987D328}.Debug|x86.ActiveCfg = Debug|Win32 + {F327EA4C-795E-49E1-832D-1F5E4987D328}.Debug|x86.Build.0 = Debug|Win32 + {F327EA4C-795E-49E1-832D-1F5E4987D328}.Release|x64.ActiveCfg = Release|x64 + {F327EA4C-795E-49E1-832D-1F5E4987D328}.Release|x64.Build.0 = Release|x64 + {F327EA4C-795E-49E1-832D-1F5E4987D328}.Release|x86.ActiveCfg = Release|Win32 + {F327EA4C-795E-49E1-832D-1F5E4987D328}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1F01EB81-FED3-46B0-A81F-E6F4ACFB0B67} + EndGlobalSection +EndGlobal diff --git a/windowCommandHook/windowCommandHook/dllmain.cpp b/windowCommandHook/windowCommandHook/dllmain.cpp new file mode 100644 index 0000000..1637303 Binary files /dev/null and b/windowCommandHook/windowCommandHook/dllmain.cpp differ diff --git a/windowCommandHook/windowCommandHook/stdafx.cpp b/windowCommandHook/windowCommandHook/stdafx.cpp new file mode 100644 index 0000000..71addd0 Binary files /dev/null and b/windowCommandHook/windowCommandHook/stdafx.cpp differ diff --git a/windowCommandHook/windowCommandHook/stdafx.h b/windowCommandHook/windowCommandHook/stdafx.h new file mode 100644 index 0000000..b937b12 Binary files /dev/null and b/windowCommandHook/windowCommandHook/stdafx.h differ diff --git a/windowCommandHook/windowCommandHook/targetver.h b/windowCommandHook/windowCommandHook/targetver.h new file mode 100644 index 0000000..567cd34 Binary files /dev/null and b/windowCommandHook/windowCommandHook/targetver.h differ diff --git a/windowCommandHook/windowCommandHook/windowCommandHook.cpp b/windowCommandHook/windowCommandHook/windowCommandHook.cpp new file mode 100644 index 0000000..66048ce Binary files /dev/null and b/windowCommandHook/windowCommandHook/windowCommandHook.cpp differ diff --git a/windowCommandHook/windowCommandHook/windowCommandHook.vcxproj b/windowCommandHook/windowCommandHook/windowCommandHook.vcxproj new file mode 100644 index 0000000..7b89115 --- /dev/null +++ b/windowCommandHook/windowCommandHook/windowCommandHook.vcxproj @@ -0,0 +1,166 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {F327EA4C-795E-49E1-832D-1F5E4987D328} + Win32Proj + windowCommandHook + 10.0.16299.0 + + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + Disabled + true + WIN32;_DEBUG;WINDOWCOMMANDHOOK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Use + Level3 + Disabled + true + _DEBUG;WINDOWCOMMANDHOOK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;WINDOWCOMMANDHOOK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;WINDOWCOMMANDHOOK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + Create + Create + Create + Create + + + + + + + \ No newline at end of file diff --git a/windowCommandHook/windowCommandHook/windowCommandHook.vcxproj.filters b/windowCommandHook/windowCommandHook/windowCommandHook.vcxproj.filters new file mode 100644 index 0000000..c7866a0 --- /dev/null +++ b/windowCommandHook/windowCommandHook/windowCommandHook.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file