diff --git a/lib/linguist/samples.json b/lib/linguist/samples.json
index 7dccfe60..2d3a6cfe 100644
--- a/lib/linguist/samples.json
+++ b/lib/linguist/samples.json
@@ -538,8 +538,8 @@
".gemrc"
]
},
- "tokens_total": 453362,
- "languages_total": 531,
+ "tokens_total": 458739,
+ "languages_total": 536,
"tokens": {
"ABAP": {
"*/**": 1,
@@ -17367,8 +17367,315 @@
"cell": 2
},
"Game Maker Language": {
- "var": 77,
- "i": 72,
+ "//draws": 1,
+ "the": 62,
+ "sprite": 12,
+ "draw": 3,
+ "true": 73,
+ ";": 1282,
+ "if": 397,
+ "(": 1501,
+ "facing": 17,
+ "RIGHT": 10,
+ ")": 1502,
+ "image_xscale": 17,
+ "-": 212,
+ "else": 151,
+ "blinkToggle": 1,
+ "{": 300,
+ "state": 50,
+ "CLIMBING": 5,
+ "or": 78,
+ "sprite_index": 14,
+ "sPExit": 1,
+ "sDamselExit": 1,
+ "sTunnelExit": 1,
+ "and": 155,
+ "global.hasJetpack": 4,
+ "not": 63,
+ "whipping": 5,
+ "draw_sprite_ext": 10,
+ "x": 76,
+ "y": 85,
+ "image_yscale": 14,
+ "image_angle": 14,
+ "image_blend": 2,
+ "image_alpha": 10,
+ "//draw_sprite": 1,
+ "draw_sprite": 9,
+ "sJetpackBack": 1,
+ "false": 85,
+ "}": 307,
+ "sJetpackRight": 1,
+ "sJetpackLeft": 1,
+ "+": 206,
+ "redColor": 2,
+ "make_color_rgb": 1,
+ "holdArrow": 4,
+ "ARROW_NORM": 2,
+ "sArrowRight": 1,
+ "ARROW_BOMB": 2,
+ "holdArrowToggle": 2,
+ "sBombArrowRight": 2,
+ "LEFT": 7,
+ "sArrowLeft": 1,
+ "sBombArrowLeft": 2,
+ "hangCountMax": 2,
+ "//////////////////////////////////////": 2,
+ "kLeft": 12,
+ "checkLeft": 1,
+ "kLeftPushedSteps": 3,
+ "kLeftPressed": 2,
+ "checkLeftPressed": 1,
+ "kLeftReleased": 3,
+ "checkLeftReleased": 1,
+ "kRight": 12,
+ "checkRight": 1,
+ "kRightPushedSteps": 3,
+ "kRightPressed": 2,
+ "checkRightPressed": 1,
+ "kRightReleased": 3,
+ "checkRightReleased": 1,
+ "kUp": 5,
+ "checkUp": 1,
+ "kDown": 5,
+ "checkDown": 1,
+ "//key": 1,
+ "canRun": 1,
+ "kRun": 2,
+ "kJump": 6,
+ "checkJump": 1,
+ "kJumpPressed": 11,
+ "checkJumpPressed": 1,
+ "kJumpReleased": 5,
+ "checkJumpReleased": 1,
+ "cantJump": 3,
+ "global.isTunnelMan": 1,
+ "sTunnelAttackL": 1,
+ "holdItem": 1,
+ "kAttack": 2,
+ "checkAttack": 2,
+ "kAttackPressed": 2,
+ "checkAttackPressed": 1,
+ "kAttackReleased": 2,
+ "checkAttackReleased": 1,
+ "kItemPressed": 2,
+ "checkItemPressed": 1,
+ "xPrev": 1,
+ "yPrev": 1,
+ "stunned": 3,
+ "dead": 3,
+ "//////////////////////////////////////////": 2,
+ "colSolidLeft": 4,
+ "colSolidRight": 3,
+ "colLeft": 6,
+ "colRight": 6,
+ "colTop": 4,
+ "colBot": 11,
+ "colLadder": 3,
+ "colPlatBot": 6,
+ "colPlat": 5,
+ "colWaterTop": 3,
+ "colIceBot": 2,
+ "runKey": 4,
+ "isCollisionMoveableSolidLeft": 1,
+ "isCollisionMoveableSolidRight": 1,
+ "isCollisionLeft": 2,
+ "isCollisionRight": 2,
+ "isCollisionTop": 1,
+ "isCollisionBottom": 1,
+ "isCollisionLadder": 1,
+ "isCollisionPlatformBottom": 1,
+ "isCollisionPlatform": 1,
+ "isCollisionWaterTop": 1,
+ "collision_point": 30,
+ "oIce": 1,
+ "checkRun": 1,
+ "runHeld": 3,
+ "HANGING": 10,
+ "approximatelyZero": 4,
+ "xVel": 24,
+ "xAcc": 12,
+ "platformCharacterIs": 23,
+ "ON_GROUND": 18,
+ "DUCKING": 4,
+ "pushTimer": 3,
+ "//if": 5,
+ "SS_IsSoundPlaying": 2,
+ "global.sndPush": 4,
+ "playSound": 3,
+ "runAcc": 2,
+ "abs": 9,
+ "alarm": 13,
+ "[": 99,
+ "]": 103,
+ "<": 39,
+ "floor": 11,
+ "/": 5,
+ "/xVel": 1,
+ "instance_exists": 8,
+ "oCape": 2,
+ "oCape.open": 6,
+ "kJumped": 7,
+ "ladderTimer": 4,
+ "ladder": 5,
+ "oLadder": 4,
+ "ladder.x": 3,
+ "oLadderTop": 2,
+ "yAcc": 26,
+ "climbAcc": 2,
+ "FALLING": 8,
+ "STANDING": 2,
+ "departLadderXVel": 2,
+ "departLadderYVel": 1,
+ "JUMPING": 6,
+ "jumpButtonReleased": 7,
+ "jumpTime": 8,
+ "IN_AIR": 5,
+ "gravityIntensity": 2,
+ "yVel": 20,
+ "RUNNING": 3,
+ "jumps": 3,
+ "//playSound": 1,
+ "global.sndLand": 1,
+ "grav": 22,
+ "global.hasGloves": 3,
+ "hangCount": 14,
+ "*": 18,
+ "yVel*0.3": 1,
+ "oWeb": 2,
+ "obj": 14,
+ "instance_place": 3,
+ "obj.life": 1,
+ "initialJumpAcc": 6,
+ "xVel/2": 3,
+ "gravNorm": 7,
+ "global.hasCape": 1,
+ "jetpackFuel": 2,
+ "fallTimer": 2,
+ "global.hasJordans": 1,
+ "yAccLimit": 2,
+ "global.hasSpringShoes": 1,
+ "global.sndJump": 1,
+ "jumpTimeTotal": 2,
+ "//let": 1,
+ "character": 20,
+ "continue": 4,
+ "to": 62,
+ "jump": 1,
+ "jumpTime/jumpTimeTotal": 1,
+ "looking": 2,
+ "UP": 1,
+ "LOOKING_UP": 4,
+ "oSolid": 14,
+ "move_snap": 6,
+ "oTree": 4,
+ "oArrow": 5,
+ "instance_nearest": 1,
+ "obj.stuck": 1,
+ "//the": 2,
+ "can": 1,
+ "t": 23,
+ "want": 1,
+ "use": 4,
+ "because": 2,
+ "is": 9,
+ "too": 2,
+ "high": 1,
+ "yPrevHigh": 1,
+ "//": 11,
+ "we": 5,
+ "ll": 1,
+ "move": 2,
+ "correct": 1,
+ "distance": 1,
+ "but": 2,
+ "need": 1,
+ "shorten": 1,
+ "out": 4,
+ "a": 55,
+ "little": 1,
+ "ratio": 1,
+ "xVelInteger": 2,
+ "/dist*0.9": 1,
+ "//can": 1,
+ "be": 4,
+ "changed": 1,
+ "moveTo": 2,
+ "round": 6,
+ "xVelInteger*ratio": 1,
+ "yVelInteger*ratio": 1,
+ "slopeChangeInY": 1,
+ "maxDownSlope": 1,
+ "floating": 1,
+ "just": 1,
+ "above": 1,
+ "slope": 1,
+ "so": 2,
+ "down": 1,
+ "upYPrev": 1,
+ "for": 26,
+ "<=upYPrev+maxDownSlope;y+=1)>": 1,
+ "hit": 1,
+ "solid": 1,
+ "below": 1,
+ "upYPrev=": 1,
+ "I": 1,
+ "know": 1,
+ "that": 2,
+ "this": 2,
+ "doesn": 1,
+ "seem": 1,
+ "make": 1,
+ "sense": 1,
+ "of": 25,
+ "name": 9,
+ "variable": 1,
+ "it": 6,
+ "all": 3,
+ "works": 1,
+ "correctly": 1,
+ "after": 1,
+ "break": 58,
+ "loop": 1,
+ "y=": 1,
+ "figures": 1,
+ "what": 1,
+ "index": 11,
+ "should": 25,
+ "characterSprite": 1,
+ "sets": 1,
+ "previous": 2,
+ "previously": 1,
+ "statePrevPrev": 1,
+ "statePrev": 2,
+ "calculates": 1,
+ "image_speed": 9,
+ "based": 1,
+ "on": 4,
+ "s": 6,
+ "velocity": 1,
+ "runAnimSpeed": 1,
+ "0": 21,
+ "1": 32,
+ "sqrt": 1,
+ "sqr": 2,
+ "climbAnimSpeed": 1,
+ "<=>": 3,
+ "4": 2,
+ "setCollisionBounds": 3,
+ "8": 9,
+ "5": 5,
+ "DUCKTOHANG": 1,
+ "image_index": 1,
+ "limit": 5,
+ "at": 23,
+ "animation": 1,
+ "always": 1,
+ "looks": 1,
+ "good": 1,
+ "var": 79,
+ "i": 95,
"playerObject": 1,
"playerID": 1,
"player": 36,
@@ -17379,22 +17686,14 @@
"plugins": 4,
"pluginsRequired": 2,
"usePlugins": 1,
- ";": 923,
- "if": 213,
- "(": 957,
"tcp_eof": 3,
"global.serverSocket": 10,
- ")": 956,
- "{": 177,
"gotServerHello": 2,
- "show_message": 6,
- "else": 78,
- "instance_destroy": 6,
+ "show_message": 7,
+ "instance_destroy": 7,
"exit": 10,
- "}": 179,
"room": 1,
"DownloadRoom": 1,
- "and": 31,
"keyboard_check": 1,
"vk_escape": 1,
"downloadingMap": 2,
@@ -17402,14 +17701,11 @@
"tcp_receive": 3,
"min": 4,
"downloadMapBytes": 2,
- "-": 110,
"buffer_size": 2,
"downloadMapBuffer": 6,
"write_buffer": 2,
"write_buffer_to_file": 1,
- "+": 126,
"downloadMapName": 3,
- "false": 40,
"buffer_destroy": 8,
"roomchange": 2,
"do": 1,
@@ -17417,28 +17713,21 @@
"read_ubyte": 10,
"case": 50,
"HELLO": 1,
- "true": 37,
"global.joinedServerName": 2,
"receivestring": 4,
"advertisedMapMd5": 1,
"receiveCompleteMessage": 1,
"global.tempBuffer": 3,
"string_pos": 20,
- "or": 21,
"Server": 3,
"sent": 7,
"illegal": 2,
- "map": 23,
- "name": 8,
+ "map": 47,
"This": 2,
"server": 10,
"requires": 1,
- "the": 19,
"following": 2,
- "to": 6,
"play": 2,
- "on": 2,
- "it": 5,
"#": 3,
"suggests": 1,
"optional": 1,
@@ -17448,10 +17737,8 @@
"plugins.": 1,
"Maps/": 2,
".png": 2,
- "The": 4,
- "s": 5,
+ "The": 6,
"version": 4,
- "of": 12,
"Enter": 1,
"Password": 1,
"Incorrect": 1,
@@ -17461,13 +17748,12 @@
"version.": 1,
"Name": 1,
"Exploit": 1,
- "Invalid": 1,
+ "Invalid": 2,
"plugin": 6,
"packet": 3,
"ID": 2,
"There": 1,
"are": 1,
- "too": 1,
"many": 1,
"connections": 1,
"from": 5,
@@ -17478,14 +17764,12 @@
"been": 1,
"kicked": 1,
"server.": 1,
- ".": 1,
+ ".": 12,
"#Server": 1,
"went": 1,
"invalid": 1,
"internal": 1,
"#Exiting.": 1,
- "/": 4,
- "is": 7,
"full.": 1,
"noone": 7,
"ERROR": 1,
@@ -17495,7 +17779,6 @@
"such": 1,
"unexpected": 1,
"data.": 1,
- "break": 56,
"until": 1,
"downloadHandle": 3,
"url": 62,
@@ -17515,7 +17798,6 @@
"temp_directory": 1,
"httpGet": 1,
"httpRequestStatus": 1,
- "//": 7,
"download": 1,
"isn": 1,
"extract": 1,
@@ -17530,11 +17812,10 @@
"killer": 11,
"assistant": 16,
"damageSource": 18,
- "argument0": 22,
- "argument1": 8,
+ "argument0": 28,
+ "argument1": 10,
"argument2": 3,
"argument3": 1,
- "instance_exists": 4,
"//*************************************": 6,
"//*": 3,
"Scoring": 1,
@@ -17542,9 +17823,7 @@
"log": 1,
"recordKillInLog": 1,
"victim.stats": 1,
- "[": 84,
"DEATHS": 1,
- "]": 84,
"WEAPON_KNIFE": 1,
"||": 16,
"WEAPON_BACKSTAB": 1,
@@ -17568,7 +17847,7 @@
"assistant.roundStats": 2,
".5": 2,
"//SPEC": 1,
- "instance_create": 12,
+ "instance_create": 20,
"victim.object.x": 3,
"victim.object.y": 3,
"Spectator": 1,
@@ -17582,7 +17861,7 @@
"view_wview": 2,
"view_hview": 2,
"randomize": 1,
- "with": 18,
+ "with": 47,
"victim.object": 2,
"WEAPON_ROCKETLAUNCHER": 1,
"WEAPON_MINEGUN": 1,
@@ -17597,13 +17876,9 @@
"distance_to_point": 3,
"xsize/2": 2,
"ysize/2": 2,
- "<": 19,
"hasReward": 4,
- "repeat": 6,
- "*": 7,
+ "repeat": 7,
"createGib": 14,
- "x": 24,
- "y": 23,
"PumpkinGib": 1,
"hspeed": 14,
"vspeed": 13,
@@ -17651,7 +17926,6 @@
"deadbody.sprite_index": 2,
"haxxyStatue": 1,
"deadbody.image_index": 2,
- "sprite_index": 2,
"CHARACTER_ANIMATION_DEAD": 1,
"deadbody.hspeed": 1,
"deadbody.vspeed": 1,
@@ -17677,8 +17951,6 @@
"global.myself.team": 3,
"xr": 19,
"yr": 19,
- "round": 4,
- "image_alpha": 7,
"cloakAlpha": 1,
"team": 13,
"canCloak": 1,
@@ -17699,9 +17971,8 @@
"mouse_y": 1,
"<25)>": 1,
"cloak": 2,
- "global": 4,
+ "global": 8,
"myself": 2,
- "1": 27,
"draw_set_halign": 1,
"fa_center": 1,
"draw_set_valign": 1,
@@ -17713,10 +17984,9 @@
"35": 1,
"showTeammateStats": 1,
"weapons": 3,
- "0": 12,
"50": 3,
"Superburst": 1,
- "string": 5,
+ "string": 13,
"currentWeapon": 2,
"uberCharge": 1,
"20": 1,
@@ -17730,7 +18000,6 @@
"Mines": 1,
"lobbed": 1,
"ubercolour": 6,
- "sprite": 10,
"overlaySprite": 6,
"zoomed": 1,
"SniperCrouchRedS": 1,
@@ -17742,9 +18011,6 @@
"omnomnomnomSprite": 2,
"omnomnomnomOverlay": 2,
"omnomnomnomindex": 4,
- "image_xscale": 12,
- "image_yscale": 11,
- "image_angle": 11,
"c_white": 13,
"ubered": 7,
"7": 4,
@@ -17753,19 +18019,15 @@
"tauntOverlay": 2,
"tauntindex": 2,
"humiliated": 1,
- "draw_sprite_ext": 7,
"humiliationPoses": 1,
- "floor": 9,
"animationImage": 9,
"humiliationOffset": 1,
"animationOffset": 6,
"burnDuration": 2,
"burnIntensity": 2,
- "for": 17,
"numFlames": 1,
"maxIntensity": 1,
"FlameS": 1,
- "alarm": 2,
"flameArray_x": 1,
"flameArray_y": 1,
"maxDuration": 1,
@@ -17775,13 +18037,12 @@
"demonY": 4,
"demonOffset": 4,
"demonDir": 2,
- "abs": 1,
"dir": 3,
"demonFrame": 5,
"sprite_get_number": 1,
"*player.team": 2,
"dir*1": 2,
- "#define": 21,
+ "#define": 26,
"__http_init": 3,
"global.__HttpClient": 4,
"object_add": 1,
@@ -17789,21 +18050,20 @@
"__http_split": 3,
"text": 19,
"delimeter": 7,
- "limit": 4,
- "list": 17,
+ "list": 36,
"count": 4,
"ds_list_create": 5,
"ds_list_add": 23,
"string_copy": 32,
"string_length": 25,
- "return": 53,
+ "return": 56,
"__http_parse_url": 4,
"ds_map_create": 4,
"ds_map_add": 15,
"colonPos": 22,
"string_char_at": 13,
"slashPos": 13,
- "real": 6,
+ "real": 14,
"queryPos": 12,
"ds_map_destroy": 6,
"__http_resolve_url": 2,
@@ -17833,7 +18093,6 @@
"ds_list_destroy": 4,
"part": 6,
"ds_list_replace": 3,
- "continue": 3,
"__http_parse_hex": 2,
"hexString": 4,
"hexValues": 3,
@@ -17842,7 +18101,7 @@
"client": 33,
"headers": 11,
"parsed": 18,
- "show_error": 1,
+ "show_error": 2,
"destroyed": 3,
"CR": 10,
"chr": 3,
@@ -17850,7 +18109,6 @@
"CRLF": 17,
"socket": 40,
"tcp_connect": 1,
- "state": 4,
"errored": 19,
"error": 18,
"linebuf": 33,
@@ -17865,9 +18123,9 @@
"requestUrl": 2,
"requestHeaders": 2,
"write_string": 9,
- "key": 7,
+ "key": 17,
"ds_map_find_first": 1,
- "is_string": 1,
+ "is_string": 2,
"ds_map_find_next": 1,
"socket_send": 1,
"__http_parse_header": 3,
@@ -17883,16 +18141,14 @@
"tcp_receive_available": 1,
"bytesRead": 6,
"c": 20,
- "<=>": 1,
"read_string": 9,
"Reached": 2,
- "end": 6,
+ "end": 11,
"HTTP": 1,
"defines": 1,
"sequence": 2,
"as": 1,
"marker": 1,
- "all": 2,
"elements": 1,
"except": 2,
"entity": 1,
@@ -17909,27 +18165,26 @@
"status": 2,
"code": 2,
"first": 3,
- "a": 20,
"Response": 1,
"message": 1,
"Status": 1,
"Line": 1,
"consisting": 1,
"followed": 1,
- "by": 4,
+ "by": 5,
"numeric": 1,
"its": 1,
"associated": 1,
"textual": 1,
"phrase": 1,
- "each": 2,
- "element": 1,
+ "each": 18,
+ "element": 8,
"separated": 1,
"SP": 1,
- "characters": 1,
+ "characters": 3,
"No": 3,
"allowed": 1,
- "in": 8,
+ "in": 21,
"final": 1,
"httpVer": 2,
"spacePos": 11,
@@ -17948,7 +18203,7 @@
"chunked": 4,
"Chunked": 1,
"let": 1,
- "decode": 1,
+ "decode": 36,
"actualResponseBody": 8,
"actualResponseSize": 1,
"actualResponseBodySize": 3,
@@ -17957,36 +18212,34 @@
"chunk": 12,
"size": 7,
"extension": 3,
- "data": 1,
+ "data": 4,
"HEX": 1,
"buffer_bytes_left": 6,
"chunkSize": 11,
"Read": 1,
"byte": 2,
"We": 1,
- "found": 1,
+ "found": 21,
"semicolon": 1,
"beginning": 1,
"skip": 1,
"stuff": 2,
"header": 2,
"Doesn": 1,
- "t": 1,
"did": 1,
- "not": 5,
- "empty": 2,
+ "empty": 13,
"something": 1,
- "up": 2,
+ "up": 6,
"Parsing": 1,
- "failed": 4,
- "hex": 1,
+ "failed": 56,
+ "hex": 2,
"was": 1,
"hexadecimal": 1,
"Is": 1,
"bigger": 2,
"than": 1,
"remaining": 1,
- "2": 1,
+ "2": 2,
"responseHaders": 1,
"location": 4,
"resolved": 5,
@@ -18112,12 +18365,10 @@
"CLASS_DEMOMAN": 1,
"CLASS_SPY": 1,
"//screw": 1,
- "index": 1,
- "we": 1,
"will": 1,
"start": 1,
"//map_truefort": 1,
- "maps": 33,
+ "maps": 37,
"//map_2dfort": 1,
"//map_conflict": 1,
"//map_classicwell": 1,
@@ -18171,14 +18422,13 @@
"tab": 2,
"string_delete": 1,
"delete": 1,
- "that": 1,
"comment": 1,
"starting": 1,
"file_text_readln": 1,
"file_text_close": 1,
"load": 1,
"ini": 1,
- "Maps": 1,
+ "Maps": 9,
"section": 1,
"//Set": 1,
"rotation": 1,
@@ -18241,6 +18491,168 @@
"AudioControlToggleMute": 1,
"room_goto_fix": 2,
"Menu": 2,
+ "__jso_gmt_tuple": 1,
+ "//Position": 1,
+ "address": 1,
+ "table": 1,
+ "pos": 2,
+ "addr_table": 2,
+ "*argument_count": 1,
+ "//Build": 1,
+ "tuple": 1,
+ "ca": 1,
+ "isstr": 1,
+ "datastr": 1,
+ "argument_count": 1,
+ "//Check": 1,
+ "argument": 10,
+ "Unexpected": 18,
+ "position": 16,
+ "f": 5,
+ "JSON": 5,
+ "string.": 5,
+ "Cannot": 5,
+ "parse": 3,
+ "boolean": 3,
+ "value": 13,
+ "expecting": 9,
+ "digit.": 9,
+ "e": 4,
+ "E": 4,
+ "dot": 1,
+ "an": 24,
+ "integer": 6,
+ "Expected": 6,
+ "least": 6,
+ "arguments": 26,
+ "got": 6,
+ "find": 10,
+ "lookup.": 4,
+ "indices": 1,
+ "nested": 27,
+ "lists": 6,
+ "Index": 1,
+ "overflow": 4,
+ "Recursive": 1,
+ "abcdef": 1,
+ "number": 7,
+ "num": 1,
+ "assert_true": 1,
+ "_assert_error_popup": 2,
+ "string_repeat": 2,
+ "_assert_newline": 2,
+ "assert_false": 1,
+ "assert_equal": 1,
+ "//Safe": 1,
+ "equality": 1,
+ "check": 1,
+ "won": 1,
+ "support": 1,
+ "instead": 1,
+ "_assert_debug_value": 1,
+ "//String": 1,
+ "os_browser": 1,
+ "browser_not_a_browser": 1,
+ "string_replace_all": 1,
+ "//Numeric": 1,
+ "GMTuple": 1,
+ "jso_encode_string": 1,
+ "encode": 8,
+ "escape": 2,
+ "jso_encode_map": 4,
+ "one": 42,
+ "key1": 3,
+ "key2": 3,
+ "multi": 7,
+ "jso_encode_list": 3,
+ "three": 36,
+ "_jso_decode_string": 5,
+ "small": 1,
+ "quick": 2,
+ "brown": 2,
+ "fox": 2,
+ "over": 2,
+ "lazy": 2,
+ "dog.": 2,
+ "simple": 1,
+ "Waahoo": 1,
+ "negg": 1,
+ "mixed": 1,
+ "_jso_decode_boolean": 2,
+ "_jso_decode_real": 11,
+ "standard": 1,
+ "zero": 4,
+ "signed": 2,
+ "decimal": 1,
+ "digits": 1,
+ "positive": 7,
+ "negative": 7,
+ "exponent": 4,
+ "_jso_decode_integer": 3,
+ "_jso_decode_map": 14,
+ "didn": 14,
+ "include": 14,
+ "right": 14,
+ "prefix": 14,
+ "#1": 14,
+ "#2": 14,
+ "entry": 29,
+ "pi": 2,
+ "bool": 2,
+ "waahoo": 10,
+ "woohah": 8,
+ "mix": 4,
+ "_jso_decode_list": 14,
+ "woo": 2,
+ "Empty": 4,
+ "equal": 20,
+ "other.": 12,
+ "junk": 2,
+ "info": 1,
+ "taxi": 1,
+ "An": 4,
+ "filled": 4,
+ "map.": 2,
+ "A": 24,
+ "B": 18,
+ "C": 8,
+ "same": 6,
+ "content": 4,
+ "entered": 4,
+ "different": 12,
+ "orders": 4,
+ "D": 1,
+ "keys": 2,
+ "values": 4,
+ "six": 1,
+ "corresponding": 4,
+ "types": 4,
+ "other": 4,
+ "crash.": 4,
+ "list.": 2,
+ "Lists": 4,
+ "two": 16,
+ "entries": 2,
+ "also": 2,
+ "jso_map_check": 9,
+ "existing": 9,
+ "single": 11,
+ "jso_map_lookup": 3,
+ "wrong": 10,
+ "trap": 2,
+ "jso_map_lookup_type": 3,
+ "type": 8,
+ "four": 21,
+ "inexistent": 11,
+ "multiple": 20,
+ "jso_list_check": 8,
+ "jso_list_lookup": 3,
+ "jso_list_lookup_type": 3,
+ "inner": 1,
+ "indexing": 1,
+ "bad": 1,
+ "jso_cleanup_map": 1,
+ "one_map": 1,
"hashList": 5,
"pluginname": 9,
"pluginhash": 4,
@@ -18269,10 +18681,8 @@
"Make": 2,
"sure": 2,
"clients": 1,
- "same": 2,
"they": 1,
"may": 2,
- "be": 2,
"unable": 2,
"connect.": 2,
"you": 1,
@@ -18300,7 +18710,6 @@
"class": 8,
"getCharacterObject": 2,
"player.object": 12,
- "collision_point": 2,
"SpawnRoom": 2,
"lastDamageDealer": 8,
"sendEventPlayerDeath": 4,
@@ -18311,7 +18720,6 @@
"lastDamageDealer.object.healer": 4,
"player.alarm": 4,
"<=0)>": 1,
- "5": 1,
"checkClasslimits": 2,
"ServerPlayerChangeclass": 2,
"sendBuffer": 1,
@@ -18394,7 +18802,104 @@
"KICK_BAD_PLUGIN_PACKET": 1,
"CLIENT_SETTINGS": 2,
"mirror": 4,
- "player.queueJump": 1
+ "player.queueJump": 1,
+ "global.levelType": 22,
+ "//global.currLevel": 1,
+ "global.currLevel": 22,
+ "global.hadDarkLevel": 4,
+ "global.startRoomX": 1,
+ "global.startRoomY": 1,
+ "global.endRoomX": 1,
+ "global.endRoomY": 1,
+ "oGame.levelGen": 2,
+ "j": 14,
+ "global.roomPath": 1,
+ "k": 5,
+ "global.lake": 3,
+ "isLevel": 1,
+ "999": 2,
+ "levelType": 2,
+ "16": 14,
+ "656": 3,
+ "oDark": 2,
+ "invincible": 2,
+ "sDark": 1,
+ "oTemple": 2,
+ "cityOfGold": 1,
+ "sTemple": 2,
+ "lake": 1,
+ "i*16": 8,
+ "j*16": 6,
+ "oLush": 2,
+ "obj.sprite_index": 4,
+ "sLush": 2,
+ "obj.invincible": 3,
+ "oBrick": 1,
+ "sBrick": 1,
+ "global.cityOfGold": 2,
+ "*16": 2,
+ "//instance_create": 2,
+ "oSpikes": 1,
+ "background_index": 1,
+ "bgTemple": 1,
+ "global.temp1": 1,
+ "global.gameStart": 3,
+ "scrLevelGen": 1,
+ "global.cemetary": 3,
+ "rand": 10,
+ "global.probCemetary": 1,
+ "oRoom": 1,
+ "scrRoomGen": 1,
+ "global.blackMarket": 3,
+ "scrRoomGenMarket": 1,
+ "scrRoomGen2": 1,
+ "global.yetiLair": 2,
+ "scrRoomGenYeti": 1,
+ "scrRoomGen3": 1,
+ "scrRoomGen4": 1,
+ "scrRoomGen5": 1,
+ "global.darkLevel": 4,
+ "global.noDarkLevel": 1,
+ "global.probDarkLevel": 1,
+ "oPlayer1.x": 2,
+ "oPlayer1.y": 2,
+ "oFlare": 1,
+ "global.genUdjatEye": 4,
+ "global.madeUdjatEye": 1,
+ "global.genMarketEntrance": 4,
+ "global.madeMarketEntrance": 1,
+ "////////////////////////////": 2,
+ "global.temp2": 1,
+ "isRoom": 3,
+ "scrEntityGen": 1,
+ "oEntrance": 1,
+ "global.customLevel": 1,
+ "oEntrance.x": 1,
+ "oEntrance.y": 1,
+ "global.snakePit": 1,
+ "global.alienCraft": 1,
+ "global.sacrificePit": 1,
+ "oPlayer1": 1,
+ "scrSetupWalls": 3,
+ "global.graphicsHigh": 1,
+ "tile_add": 4,
+ "bgExtrasLush": 1,
+ "*rand": 12,
+ "bgExtrasIce": 1,
+ "bgExtrasTemple": 1,
+ "bgExtras": 1,
+ "global.murderer": 1,
+ "global.thiefLevel": 1,
+ "isRealLevel": 1,
+ "oExit": 1,
+ "oShopkeeper": 1,
+ "obj.status": 1,
+ "oTreasure": 1,
+ "oWater": 1,
+ "sWaterTop": 1,
+ "sLavaTop": 1,
+ "scrCheckWaterTop": 1,
+ "global.temp3": 1
},
"GAS": {
".cstring": 1,
@@ -48849,7 +49354,7 @@
"Erlang": 2928,
"fish": 636,
"Forth": 1516,
- "Game Maker Language": 7933,
+ "Game Maker Language": 13310,
"GAS": 133,
"GLSL": 3766,
"Gosu": 410,
@@ -48992,7 +49497,7 @@
"Erlang": 5,
"fish": 3,
"Forth": 7,
- "Game Maker Language": 8,
+ "Game Maker Language": 13,
"GAS": 1,
"GLSL": 3,
"Gosu": 4,
@@ -49101,5 +49606,5 @@
"Oxygene": 1,
"RMarkdown": 1
},
- "md5": "d553eccf00cb7981cddf40658c0f42ae"
+ "md5": "f41f28c5524157cbfbdd2e09957d3d78"
}
\ No newline at end of file
diff --git a/samples/Game Maker Language/characterDrawEvent.gml b/samples/Game Maker Language/characterDrawEvent.gml
new file mode 100644
index 00000000..6dcd8fcc
--- /dev/null
+++ b/samples/Game Maker Language/characterDrawEvent.gml
@@ -0,0 +1,80 @@
+// Originally from /spelunky/Scripts/Platform Engine/characterDrawEvent.gml in the Spelunky Community Update Project
+
+/**********************************************************************************
+ Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC
+
+ This file is part of Spelunky.
+
+ You can redistribute and/or modify Spelunky, including its source code, under
+ the terms of the Spelunky User License.
+
+ Spelunky is distributed in the hope that it will be entertaining and useful,
+ but WITHOUT WARRANTY. Please see the Spelunky User License for more details.
+
+ The Spelunky User License should be available in "Game Information", which
+ can be found in the Resource Explorer, or as an external file called COPYING.
+ If not, please obtain a new copy of Spelunky from
+
+***********************************************************************************/
+
+/*
+This event should be placed in the draw event of the platform character.
+*/
+//draws the sprite
+draw = true;
+if (facing == RIGHT) image_xscale = -1;
+else image_xscale = 1;
+
+if (blinkToggle != 1)
+{
+ if ((state == CLIMBING or (sprite_index == sPExit or sprite_index == sDamselExit or sprite_index == sTunnelExit)) and global.hasJetpack and not whipping)
+ {
+ draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);
+ //draw_sprite(sprite_index,-1,x,y);
+ draw_sprite(sJetpackBack,-1,x,y);
+ draw = false;
+ }
+ else if (global.hasJetpack and facing == RIGHT) draw_sprite(sJetpackRight,-1,x-4,y-1);
+ else if (global.hasJetpack) draw_sprite(sJetpackLeft,-1,x+4,y-1);
+ if (draw)
+ {
+ if (redColor > 0) draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, make_color_rgb(200 + redColor,0,0), image_alpha);
+ else draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);
+ }
+ if (facing == RIGHT)
+ {
+ if (holdArrow == ARROW_NORM)
+ {
+ draw_sprite(sArrowRight, -1, x+4, y+1);
+ }
+ else if (holdArrow == ARROW_BOMB)
+ {
+ if (holdArrowToggle) draw_sprite(sBombArrowRight, 0, x+4, y+2);
+ else draw_sprite(sBombArrowRight, 1, x+4, y+2);
+ }
+ }
+ else if (facing == LEFT)
+ {
+ if (holdArrow == ARROW_NORM)
+ {
+ draw_sprite(sArrowLeft, -1, x-4, y+1);
+ }
+ else if (holdArrow == ARROW_BOMB)
+ {
+ if (holdArrowToggle) draw_sprite(sBombArrowLeft, 0, x-4, y+2);
+ else draw_sprite(sBombArrowLeft, 1, x-4, y+2);
+ }
+ }
+}
+/*
+if canRun
+{
+ xOffset=80
+ if player=1
+ yOffset=120
+ else
+ yOffset=143
+ //draw the "flySpeed" bar, which shows how much speed the character has acquired while holding the "run" button
+ //draw_healthbar(view_xview[0]+224+xOffset,view_yview[0]+432+yOffset,view_xview[0]+400+xOffset,view_yview[0]+450+yOffset,flySpeed,make_color_rgb(0,64,128),c_blue,c_aqua,0,1,1)
+}
+*/
diff --git a/samples/Game Maker Language/characterStepEvent.gml b/samples/Game Maker Language/characterStepEvent.gml
new file mode 100644
index 00000000..7416df80
--- /dev/null
+++ b/samples/Game Maker Language/characterStepEvent.gml
@@ -0,0 +1,1050 @@
+// Originally from /spelunky/Scripts/Platform Engine/characterStepEvent.gml in the Spelunky Community Update Project
+
+/**********************************************************************************
+ Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC
+
+ This file is part of Spelunky.
+
+ You can redistribute and/or modify Spelunky, including its source code, under
+ the terms of the Spelunky User License.
+
+ Spelunky is distributed in the hope that it will be entertaining and useful,
+ but WITHOUT WARRANTY. Please see the Spelunky User License for more details.
+
+ The Spelunky User License should be available in "Game Information", which
+ can be found in the Resource Explorer, or as an external file called COPYING.
+ If not, please obtain a new copy of Spelunky from
+
+***********************************************************************************/
+
+/*
+This script should be placed in the step event for the platform character.
+It updates the keys used by the character, moves all of the solids, moves the
+character, sets the sprite index, and sets the animation speed for the sprite.
+*/
+hangCountMax = 3;
+
+//////////////////////////////////////
+// KEYS
+//////////////////////////////////////
+
+kLeft = checkLeft();
+
+if (kLeft) kLeftPushedSteps += 1;
+else kLeftPushedSteps = 0;
+
+kLeftPressed = checkLeftPressed();
+kLeftReleased = checkLeftReleased();
+
+kRight = checkRight();
+
+if (kRight) kRightPushedSteps += 1;
+else kRightPushedSteps = 0;
+
+kRightPressed = checkRightPressed();
+kRightReleased = checkRightReleased();
+
+kUp = checkUp();
+kDown = checkDown();
+
+//key "run"
+if canRun
+ kRun = 0;
+// kRun=runKey
+else
+ kRun=0
+
+kJump = checkJump();
+kJumpPressed = checkJumpPressed();
+kJumpReleased = checkJumpReleased();
+
+if (cantJump > 0)
+{
+ kJump = 0;
+ kJumpPressed = 0;
+ kJumpReleased = 0;
+ cantJump -= 1;
+}
+else
+{
+ if (global.isTunnelMan and
+ sprite_index == sTunnelAttackL and
+ !holdItem)
+ {
+ kJump = 0;
+ kJumpPressed = 0;
+ kJumpReleased = 0;
+ cantJump -= 1;
+ }
+}
+
+kAttack = checkAttack();
+kAttackPressed = checkAttackPressed();
+kAttackReleased = checkAttackReleased();
+
+kItemPressed = checkItemPressed();
+
+xPrev = x;
+yPrev = y;
+
+if (stunned or dead)
+{
+ kLeft = false;
+ kLeftPressed = false;
+ kLeftReleased = false;
+ kRight = false;
+ kRightPressed = false;
+ kRightReleased = false;
+ kUp = false;
+ kDown = false;
+ kJump = false;
+ kJumpPressed = false;
+ kJumpReleased = false;
+ kAttack = false;
+ kAttackPressed = false;
+ kAttackReleased = false;
+ kItemPressed = false;
+}
+
+//////////////////////////////////////////
+// Collisions
+//////////////////////////////////////////
+
+colSolidLeft = false;
+colSolidRight = false;
+colLeft = false;
+colRight = false;
+colTop = false;
+colBot = false;
+colLadder = false;
+colPlatBot = false;
+colPlat = false;
+colWaterTop = false;
+colIceBot = false;
+runKey = false;
+if (isCollisionMoveableSolidLeft(1)) colSolidLeft = true;
+if (isCollisionMoveableSolidRight(1)) colSolidRight = true;
+if (isCollisionLeft(1)) colLeft = true;
+if (isCollisionRight(1)) colRight = true;
+if (isCollisionTop(1)) colTop = true;
+if (isCollisionBottom(1)) colBot = true;
+if (isCollisionLadder()) colLadder = true;
+if (isCollisionPlatformBottom(1)) colPlatBot = true;
+if (isCollisionPlatform()) colPlat = true;
+if (isCollisionWaterTop(1)) colWaterTop = true;
+if (collision_point(x, y+8, oIce, 0, 0)) colIceBot = true;
+if (checkRun())
+{
+ runHeld = 100;
+ runKey = true;
+}
+
+if (checkAttack() and not whipping)
+{
+ runHeld += 1;
+ runKey = true;
+}
+
+if (not runKey or (not kLeft and not kRight)) runHeld = 0;
+
+// allows the character to run left and right
+// if state!=DUCKING and state!=LOOKING_UP and state!=CLIMBING
+if (state != CLIMBING and state != HANGING)
+{
+ if (kLeftReleased and approximatelyZero(xVel)) xAcc -= 0.5
+ if (kRightReleased and approximatelyZero(xVel)) xAcc += 0.5
+
+ if (kLeft and not kRight)
+ {
+ if (colSolidLeft)
+ {
+ // xVel = 3;
+ if (platformCharacterIs(ON_GROUND) and state != DUCKING)
+ {
+ xAcc -= 1;
+ pushTimer += 10;
+ //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush);
+ }
+ }
+ else if (kLeftPushedSteps > 2) and (facing=LEFT or approximatelyZero(xVel))
+ {
+ xAcc -= runAcc;
+ }
+ facing = LEFT;
+ //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/-xVel);
+ }
+
+ if (kRight and not kLeft)
+ {
+ if (colSolidRight)
+ {
+ // xVel = 3;
+ if (platformCharacterIs(ON_GROUND) and state != DUCKING)
+ {
+ xAcc += 1;
+ pushTimer += 10;
+ //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush);
+ }
+ }
+ else if (kRightPushedSteps > 2 or colSolidLeft) and (facing=RIGHT or approximatelyZero(xVel))
+ {
+ xAcc += runAcc;
+ }
+ facing = RIGHT;
+ //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/xVel);
+ }
+}
+
+/******************************************
+
+ LADDERS
+
+*******************************************/
+
+if (state == CLIMBING)
+{
+ if (instance_exists(oCape))
+ {
+ oCape.open = false;
+ }
+ kJumped = false;
+ ladderTimer = 10;
+ ladder = collision_point(x, y, oLadder, 0, 0);
+ if (ladder) x = ladder.x + 8;
+
+ if (kLeft) facing = LEFT;
+ else if (kRight) facing = RIGHT;
+ if (kUp)
+ {
+ if (collision_point(x, y-8, oLadder, 0, 0) or collision_point(x, y-8, oLadderTop, 0, 0))
+ {
+ yAcc -= climbAcc;
+ if (alarm[2] < 1) alarm[2] = 8;
+ }
+ }
+ else if (kDown)
+ {
+ if (collision_point(x, y+8, oLadder, 0, 0) or collision_point(x, y+8, oLadderTop, 0, 0))
+ {
+ yAcc += climbAcc;
+ if (alarm[2] < 1) alarm[2] = 8;
+ }
+ else
+ state = FALLING;
+ if (colBot) state = STANDING;
+ }
+
+ if (kJumpPressed and not whipping)
+ {
+ if (kLeft)
+ xVel = -departLadderXVel;
+ else if (kRight)
+ xVel = departLadderXVel;
+ else
+ xVel = 0;
+ yAcc += departLadderYVel;
+ state = JUMPING;
+ jumpButtonReleased = 0;
+ jumpTime = 0;
+ ladderTimer = 5;
+ }
+}
+else
+{
+ if (ladderTimer > 0) ladderTimer -= 1;
+}
+
+if (platformCharacterIs(IN_AIR) and state != HANGING)
+{
+ yAcc += gravityIntensity;
+}
+
+// Player has landed
+if ((colBot or colPlatBot) and platformCharacterIs(IN_AIR) and yVel >= 0)
+{
+ if (not colPlat or colBot)
+ {
+ yVel = 0;
+ yAcc = 0;
+ state = RUNNING;
+ jumps = 0;
+ }
+ //playSound(global.sndLand);
+}
+if ((colBot or colPlatBot) and not colPlat) yVel = 0;
+
+// Player has just walked off of the edge of a solid
+if (colBot == 0 and (not colPlatBot or colPlat) and platformCharacterIs(ON_GROUND))
+{
+ state = FALLING;
+ yAcc += grav;
+ kJumped = true;
+ if (global.hasGloves) hangCount = 5;
+}
+
+if (colTop)
+{
+ if (dead or stunned) yVel = -yVel * 0.8;
+ else if (state == JUMPING) yVel = abs(yVel*0.3)
+}
+
+if (colLeft and facing == LEFT) or (colRight and facing == RIGHT)
+{
+ if (dead or stunned) xVel = -xVel * 0.5;
+ else xVel = 0;
+}
+
+/******************************************
+
+ JUMPING
+
+*******************************************/
+
+if (kJumpReleased and platformCharacterIs(IN_AIR))
+{
+ kJumped = true;
+}
+else if (platformCharacterIs(ON_GROUND))
+{
+ oCape.open = false;
+ kJumped = false;
+}
+
+if (kJumpPressed and collision_point(x, y, oWeb, 0, 0))
+{
+ obj = instance_place(x, y, oWeb);
+ obj.life -= 1;
+ yAcc += initialJumpAcc * 2;
+ yVel -= 3;
+ xAcc += xVel/2;
+
+ state = JUMPING;
+ jumpButtonReleased = 0;
+ jumpTime = 0;
+
+ grav = gravNorm;
+}
+else if (kJumpPressed and colWaterTop)
+{
+ yAcc += initialJumpAcc * 2;
+ yVel -= 3;
+ xAcc += xVel/2;
+
+ state = JUMPING;
+ jumpButtonReleased = 0;
+ jumpTime = 0;
+
+ grav = gravNorm;
+}
+else if (global.hasCape and kJumpPressed and kJumped and platformCharacterIs(IN_AIR))
+{
+ if (not oCape.open) oCape.open = true;
+ else oCape.open = false;
+}
+else if (global.hasJetpack and kJump and kJumped and platformCharacterIs(IN_AIR) and jetpackFuel > 0)
+{
+ yAcc += initialJumpAcc;
+ yVel = -1;
+ jetpackFuel -= 1;
+ if (alarm[10] < 1) alarm[10] = 3;
+
+ state = JUMPING;
+ jumpButtonReleased = 0;
+ jumpTime = 0;
+
+ grav = 0;
+}
+else if (platformCharacterIs(ON_GROUND) and kJumpPressed and fallTimer == 0)
+{
+ if (xVel > 3 or xVel < -3)
+ {
+ yAcc += initialJumpAcc * 2;
+ xAcc += xVel * 2;
+ }
+ else
+ {
+ yAcc += initialJumpAcc * 2;
+ xAcc += xVel/2;
+ }
+
+ if (global.hasJordans)
+ {
+ yAcc *= 3;
+ yAccLimit = 12;
+ grav = 0.5;
+ }
+ else if (global.hasSpringShoes) yAcc *= 1.5;
+ else
+ {
+ yAccLimit = 6;
+ grav = gravNorm;
+ }
+
+ playSound(global.sndJump);
+
+ pushTimer = 0;
+
+ // the "state" gets changed to JUMPING later on in the code
+ state = FALLING;
+ // "variable jumping" states
+ jumpButtonReleased = 0;
+ jumpTime = 0;
+}
+
+if (jumpTime < jumpTimeTotal) jumpTime += 1;
+//let the character continue to jump
+if (kJump == 0) jumpButtonReleased = 1;
+if (jumpButtonReleased) jumpTime = jumpTimeTotal;
+
+gravityIntensity = (jumpTime/jumpTimeTotal) * grav;
+
+if (kUp and platformCharacterIs(ON_GROUND) and not colLadder)
+{
+ looking = UP;
+ if (xVel == 0 and xAcc == 0) state = LOOKING_UP;
+}
+else looking = 0;
+
+if (not kUp and state == LOOKING_UP)
+{
+ state=STANDING
+}
+
+/******************************************
+
+ HANGING
+
+*******************************************/
+
+if (not colTop)
+{
+if (global.hasGloves and yVel > 0)
+{
+ if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and
+ (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)))
+ {
+ state = HANGING;
+ move_snap(1, 8);
+ yVel = 0;
+ yAcc = 0;
+ grav = 0;
+ }
+ else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and
+ (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)))
+ {
+ state = HANGING;
+ move_snap(1, 8);
+ yVel = 0;
+ yAcc = 0;
+ grav = 0;
+ }
+}
+else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and
+ (collision_point(x+9, y-5, oTree, 0, 0) or collision_point(x+9, y-6, oTree, 0, 0)))
+{
+ state = HANGING;
+ move_snap(1, 8);
+ yVel = 0;
+ yAcc = 0;
+ grav = 0;
+}
+else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and
+ (collision_point(x-9, y-5, oTree, 0, 0) or collision_point(x-9, y-6, oTree, 0, 0)))
+{
+ state = HANGING;
+ move_snap(1, 8);
+ yVel = 0;
+ yAcc = 0;
+ grav = 0;
+}
+else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and
+ (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)) and
+ not collision_point(x+9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0))
+{
+ state = HANGING;
+ move_snap(1, 8);
+ yVel = 0;
+ yAcc = 0;
+ grav = 0;
+}
+else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and
+ (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)) and
+ not collision_point(x-9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0))
+{
+ state = HANGING;
+ move_snap(1, 8);
+ yVel = 0;
+ yAcc = 0;
+ grav = 0;
+}
+
+if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and
+ (collision_point(x, y-5, oArrow, 0, 0) or collision_point(x, y-6, oArrow, 0, 0)) and
+ not collision_point(x, y-9, oArrow, 0, 0) and not collision_point(x, y+9, oArrow, 0, 0))
+{
+ obj = instance_nearest(x, y-5, oArrow);
+ if (obj.stuck)
+ {
+ state = HANGING;
+ // move_snap(1, 8);
+ yVel = 0;
+ yAcc = 0;
+ grav = 0;
+ }
+}
+
+/*
+if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and
+ (collision_point(x, y-5, oTreeBranch, 0, 0) or collision_point(x, y-6, oTreeBranch, 0, 0)) and
+ not collision_point(x, y-9, oTreeBranch, 0, 0) and not collision_point(x, y+9, oTreeBranch, 0, 0))
+{
+ state = HANGING;
+ // move_snap(1, 8);
+ yVel = 0;
+ yAcc = 0;
+ grav = 0;
+}
+*/
+
+}
+
+if (hangCount > 0) hangCount -= 1;
+
+if (state == HANGING)
+{
+ if (instance_exists(oCape)) oCape.open = false;
+ kJumped = false;
+
+ if (kDown and kJumpPressed)
+ {
+ grav = gravNorm;
+ state = FALLING;
+ yAcc -= grav;
+ hangCount = 5;
+ if (global.hasGloves) hangCount = 10;
+ }
+ else if (kJumpPressed)
+ {
+ grav = gravNorm;
+ if ((facing == RIGHT and kLeft) or (facing == LEFT and kRight))
+ {
+ state = FALLING;
+ yAcc -= grav;
+ }
+ else
+ {
+ state = JUMPING;
+ yAcc += initialJumpAcc * 2;
+ if (facing == RIGHT) x -= 2;
+ else x += 2;
+ }
+ hangCount = hangCountMax;
+ }
+
+ if ((facing == LEFT and not isCollisionLeft(2)) or
+ (facing == RIGHT and not isCollisionRight(2)))
+ {
+ grav = gravNorm;
+ state = FALLING;
+ yAcc -= grav;
+ hangCount = 4;
+ }
+}
+else
+{
+ grav = gravNorm;
+}
+
+// pressing down while standing
+if (kDown and platformCharacterIs(ON_GROUND) and not whipping)
+{
+ if (colBot)
+ {
+ state = DUCKING;
+ }
+ else if colPlatBot
+ {
+ // climb down ladder if possible, else jump down
+ fallTimer = 0;
+ if (not colBot)
+ {
+ ladder = 0;
+ ladder = instance_place(x, y+16, oLadder);
+ if (instance_exists(ladder))
+ {
+ if (abs(x-(ladder.x+8)) < 4)
+ {
+ x = ladder.x + 8;
+
+ xVel = 0;
+ yVel = 0;
+ xAcc = 0;
+ yAcc = 0;
+ state = CLIMBING;
+ }
+ }
+ else
+ {
+ y += 1;
+ state = FALLING;
+ yAcc += grav;
+ }
+ }
+ else
+ {
+ //the character can't move down because there is a solid in the way
+ state = RUNNING;
+ }
+ }
+}
+if (not kDown and state == DUCKING)
+{
+ state = STANDING;
+ xVel = 0;
+ xAcc = 0;
+}
+if (xVel == 0 and xAcc == 0 and state == RUNNING)
+{
+ state = STANDING;
+}
+if (xAcc != 0 and state == STANDING)
+{
+ state = RUNNING;
+}
+if (yVel < 0 and platformCharacterIs(IN_AIR) and state != HANGING)
+{
+ state = JUMPING;
+}
+if (yVel > 0 and platformCharacterIs(IN_AIR) and state != HANGING)
+{
+ state = FALLING;
+ setCollisionBounds(-5, -6, 5, 8);
+}
+else setCollisionBounds(-5, -8, 5, 8);
+
+// CLIMB LADDER
+colPointLadder = collision_point(x, y, oLadder, 0, 0) or collision_point(x, y, oLadderTop, 0, 0);
+
+if ((kUp and platformCharacterIs(IN_AIR) and collision_point(x, y-8, oLadder, 0, 0) and ladderTimer == 0) or
+ (kUp and colPointLadder and ladderTimer == 0) or
+ (kDown and colPointLadder and ladderTimer == 0 and platformCharacterIs(ON_GROUND) and collision_point(x, y+9, oLadderTop, 0, 0) and xVel == 0))
+{
+ ladder = 0;
+ ladder = instance_place(x, y-8, oLadder);
+ if (instance_exists(ladder))
+ {
+ if (abs(x-(ladder.x+8)) < 4)
+ {
+ x = ladder.x + 8;
+ if (not collision_point(x, y, oLadder, 0, 0) and
+ not collision_point(x, y, oLadderTop, 0, 0))
+ {
+ y = ladder.y + 14;
+ }
+
+ xVel = 0;
+ yVel = 0;
+ xAcc = 0;
+ yAcc = 0;
+ state = CLIMBING;
+ }
+ }
+}
+
+/*
+if (sprite_index == sDuckToHangL or sprite_index == sDamselDtHL)
+{
+ ladder = 0;
+ if (facing == LEFT and collision_rectangle(x-8, y, x, y+16, oLadder, 0, 0) and not collision_point(x-4, y+16, oSolid, 0, 0))
+ {
+ ladder = instance_nearest(x-4, y+16, oLadder);
+ }
+ else if (facing == RIGHT and collision_rectangle(x, y, x+8, y+16, oLadder, 0, 0) and not collision_point(x+4, y+16, oSolid, 0, 0))
+ {
+ ladder = instance_nearest(x+4, y+16, oLadder);
+ }
+
+ if (ladder)
+ {
+ x = ladder.x + 8;
+
+ xVel = 0;
+ yVel = 0;
+ xAcc = 0;
+ yAcc = 0;
+ state = CLIMBING;
+ }
+}
+*/
+/*
+if (colLadder and state == CLIMBING and kJumpPressed and not whipping)
+{
+ if (kLeft)
+ xVel = -departLadderXVel;
+ else if (kRight)
+ xVel = departLadderXVel;
+ else
+ xVel = 0;
+ yAcc += departLadderYVel;
+ state = JUMPING;
+ jumpButtonReleased = 0;
+ jumpTime = 0;
+ ladderTimer = 5;
+}
+*/
+
+// Calculate horizontal/vertical friction
+if (state == CLIMBING)
+{
+ xFric = frictionClimbingX;
+ yFric = frictionClimbingY;
+}
+else
+{
+ if (runKey and platformCharacterIs(ON_GROUND) and runHeld >= 10)
+ {
+ if (kLeft) // run
+ {
+ xVel -= 0.1;
+ xVelLimit = 6;
+ xFric = frictionRunningFastX;
+ }
+ else if (kRight)
+ {
+ xVel += 0.1;
+ xVelLimit = 6;
+ xFric = frictionRunningFastX;
+ }
+ }
+ else if (state == DUCKING)
+ {
+ if (xVel<2 and xVel>-2)
+ {
+ xFric = 0.2
+ xVelLimit = 3;
+ image_speed = 0.8;
+ }
+ else if (kLeft and global.downToRun) // run
+ {
+ xVel -= 0.1;
+ xVelLimit = 6;
+ xFric = frictionRunningFastX;
+ }
+ else if (kRight and global.downToRun)
+ {
+ xVel += 0.1;
+ xVelLimit = 6;
+ xFric = frictionRunningFastX;
+ }
+ else
+ {
+ xVel *= 0.8;
+ if (xVel < 0.5) xVel = 0;
+ xFric = 0.2
+ xVelLimit = 3;
+ image_speed = 0.8;
+ }
+ }
+ else
+ {
+ //decrease the friction when the character is "flying"
+ if (platformCharacterIs(IN_AIR))
+ {
+ if (dead or stunned) xFric = 1.0;
+ else xFric = 0.8;
+ }
+ else
+ {
+ xFric = frictionRunningX;
+ }
+ }
+
+ // Stuck on web or underwater
+ if (collision_point(x, y, oWeb, 0, 0))
+ {
+ xFric = 0.2;
+ yFric = 0.2;
+ fallTimer = 0;
+ }
+ else if (collision_point(x, y, oWater, -1, -1))
+ {
+ if (instance_exists(oCape)) oCape.open = false;
+
+ if (state == FALLING and yVel > 0)
+ {
+ yFric = 0.5;
+ }
+ else if (not collision_point(x, y-9, oWater, -1, -1))
+ {
+ yFric = 1;
+ }
+ else
+ {
+ yFric = 0.9;
+ }
+ }
+ else
+ {
+ swimming = false;
+ yFric = 1;
+ }
+}
+
+if (colIceBot and state != DUCKING and not global.hasSpikeShoes)
+{
+ xFric = 0.98;
+ yFric = 1;
+}
+
+// RUNNING
+
+if (platformCharacterIs(ON_GROUND))
+{
+ if (state == RUNNING and kLeft and colLeft)
+ {
+ pushTimer += 1;
+ }
+ else if (state == RUNNING and kRight and colRight)
+ {
+ pushTimer += 1;
+ }
+ else
+ {
+ pushTimer = 0;
+ }
+
+ if (platformCharacterIs(ON_GROUND) and not kJump and not kDown and not runKey)
+ {
+ xVelLimit = 3;
+ }
+
+
+ // ledge flip
+ if (state == DUCKING and abs(xVel) < 3 and facing == LEFT and
+ collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x-1, y+9, x-10, y+9, oSolid, 0, 0) and kLeft)
+ {
+ state = DUCKTOHANG;
+
+ if (holdItem)
+ {
+ holdItem.held = false;
+ if (holdItem.type == "Gold Idol") holdItem.y -= 8;
+ scrDropItem(-1, -4);
+ }
+
+ with oMonkey
+ {
+ // knock off monkeys that grabbed you
+ if (status == 7)
+ {
+ xVel = -1;
+ yVel = -4;
+ status = 1;
+ vineCounter = 20;
+ grabCounter = 60;
+ }
+ }
+ }
+ else if (state == DUCKING and abs(xVel) < 3 and facing == RIGHT and
+ collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x+1, y+9, x+10, y+9, oSolid, 0, 0) and kRight)
+ {
+ state = DUCKTOHANG;
+
+ if (holdItem)
+ {
+ // holdItem.held = false;
+ if (holdItem.type == "Gold Idol") holdItem.y -= 8;
+ scrDropItem(1, -4);
+ }
+
+ with oMonkey
+ {
+ // knock off monkeys that grabbed you
+ if (status == 7)
+ {
+ xVel = 1;
+ yVel = -4;
+ status = 1;
+ vineCounter = 20;
+ grabCounter = 60;
+ }
+ }
+ }
+}
+
+if (state == DUCKTOHANG)
+{
+ x = xPrev;
+ y = yPrev;
+ xVel = 0;
+ yVel = 0;
+ xAcc = 0;
+ yAcc = 0;
+ grav = 0;
+}
+
+// PARACHUTE AND CAPE
+if (instance_exists(oParachute))
+{
+ yFric = 0.5;
+}
+if (instance_exists(oCape))
+{
+ if (oCape.open) yFric = 0.5;
+}
+
+if (pushTimer > 100) pushTimer = 100;
+
+// limits the acceleration if it is too extreme
+if (xAcc > xAccLimit) xAcc = xAccLimit;
+else if (xAcc < -xAccLimit) xAcc = -xAccLimit;
+if (yAcc > yAccLimit) yAcc = yAccLimit;
+else if (yAcc < -yAccLimit) yAcc = -yAccLimit;
+
+// applies the acceleration
+xVel += xAcc;
+if (dead or stunned) yVel += 0.6;
+else yVel += yAcc;
+
+// nullifies the acceleration
+xAcc = 0;
+yAcc = 0;
+
+// applies the friction to the velocity, now that the velocity has been calculated
+xVel *= xFric;
+yVel *= yFric;
+
+// apply ball and chain
+if (instance_exists(oBall))
+{
+ if (distance_to_object(oBall) >= 24)
+ {
+ if (xVel > 0 and oBall.x < x and abs(oBall.x-x) > 24) xVel = 0;
+ if (xVel < 0 and oBall.x > x and abs(oBall.x-x) > 24) xVel = 0;
+ if (yVel > 0 and oBall.y < y and abs(oBall.y-y) > 24)
+ {
+ if (abs(oBall.x-x) < 1)
+ {
+ x = oBall.x;
+ }
+ else if (oBall.x < x and not kRight)
+ {
+ if (xVel > 0) xVel *= -0.25;
+ else if (xVel == 0) xVel -= 1;
+ }
+ else if (oBall.x > x and not kLeft)
+ {
+ if (xVel < 0) xVel *= -0.25;
+ else if (xVel == 0) xVel += 1;
+ }
+ yVel = 0;
+ fallTimer = 0;
+ }
+ if (yVel < 0 and oBall.y > y and abs(oBall.y-y) > 24) yVel = 0;
+ }
+}
+
+// apply the limits since the velocity may be too extreme
+if (not dead and not stunned)
+{
+ if (xVel > xVelLimit) xVel = xVelLimit;
+ else if (xVel < -xVelLimit) xVel = -xVelLimit;
+}
+if (yVel > yVelLimit) yVel = yVelLimit;
+else if (yVel < -yVelLimit) yVel = -yVelLimit;
+
+// approximates the "active" variables
+if approximatelyZero(xVel) xVel=0
+if approximatelyZero(yVel) yVel=0
+if approximatelyZero(xAcc) xAcc=0
+if approximatelyZero(yAcc) yAcc=0
+
+// prepares the character to move up a hill
+// we need to use the "slopeYPrev" variable later to know the "true" y previous value
+// keep this condition the same
+if maxSlope>0 and platformCharacterIs(ON_GROUND) and xVel!=0
+{
+ slopeYPrev=y
+ for(y=y;y>=slopeYPrev-maxSlope;y-=1)
+ if colTop
+ break
+ slopeChangeInY=slopeYPrev-y
+}
+else
+ slopeChangeInY=0
+
+// moves the character, and balances out the effects caused by other processes
+// keep this condition the same
+if maxSlope*abs(xVel)>0 and platformCharacterIs(ON_GROUND)
+{
+ // we need to check if we should dampen out the speed as the character runs on upward slopes
+ xPrev=x
+ yPrev=slopeYPrev // we don't want to use y, because y is too high
+ yPrevHigh=y // we'll use the higher previous variable later
+ moveTo(xVel,yVel+slopeChangeInY)
+ dist=point_distance(xPrev,yPrev,x,y)// overall distance that has been traveled
+ // we should have only ran at xVel
+ if dist>abs(xVelInteger)
+ {
+ // show_message(string(dist)+ " "+string(abs(xVelInteger)))
+ excess=dist-abs(xVelInteger)
+ if(xVelInteger<0)
+ excess*=-1
+ // move back since the character moved too far
+ x=xPrev
+ y=yPrevHigh // we need the character to be high so the character can move down
+ // this time we'll move the correct distance, but we need to shorten out the xVel a little
+ // these lines can be changed for different types of slowing down when running up hills
+ ratio=abs(xVelInteger)/dist*0.9 //can be changed
+ moveTo( round(xVelInteger*ratio),round(yVelInteger*ratio+slopeChangeInY) )
+ }
+}
+else
+{
+ // we simply move xVel and yVel while in the air or on a ladder
+ moveTo(xVel,yVel)
+}
+// move the character downhill if possible
+// we need to multiply maxDownSlope by the absolute value of xVel since the character normally runs at an xVel larger than 1
+if not colBot and maxDownSlope>0 and xVelInteger!=0 and platformCharacterIs(ON_GROUND)
+{
+ //the character is floating just above the slope, so move the character down
+ upYPrev=y
+ for(y=y;y<=upYPrev+maxDownSlope;y+=1)
+ if colBot // we hit a solid below
+ {
+ upYPrev=y // I know that this doesn't seem to make sense, because of the name of the variable, but it all works out correctly after we break out of this loop
+ break
+ }
+ y=upYPrev
+}
+
+//figures out what the sprite index of the character should be
+characterSprite();
+
+//sets the previous state and the previously previous state
+statePrevPrev = statePrev;
+statePrev = state;
+
+//calculates the image_speed based on the character's velocity
+if (state == RUNNING or state == DUCKING or state == LOOKING_UP)
+{
+ if (state == RUNNING or state == LOOKING_UP) image_speed = abs(xVel) * runAnimSpeed + 0.1;
+}
+
+if (state == CLIMBING) image_speed = sqrt(sqr(abs(xVel))+sqr(abs(yVel))) * climbAnimSpeed
+if (xVel >= 4 or xVel <= -4)
+{
+ image_speed = 1;
+ if (platformCharacterIs(ON_GROUND)) setCollisionBounds(-8, -8, 8, 8);
+ else setCollisionBounds(-5, -8, 5, 8);
+}
+else setCollisionBounds(-5, -8, 5, 8);
+if (whipping) image_speed = 1;
+if (state == DUCKTOHANG)
+{
+ image_index = 0;
+ image_speed = 0.8;
+}
+//limit the image_speed at 1 so the animation always looks good
+if (image_speed > 1) image_speed = 1;
diff --git a/samples/Game Maker Language/jsonion.gml b/samples/Game Maker Language/jsonion.gml
new file mode 100644
index 00000000..e4d2a6cb
--- /dev/null
+++ b/samples/Game Maker Language/jsonion.gml
@@ -0,0 +1,1861 @@
+// Originally from /jsonion.gml in JSOnion
+// JSOnion v1.0.0d is licensed under the MIT licence. You may freely adapt and use this library in commercial and non-commercial projects.
+
+#define __jso_gmt_tuple
+{
+
+ /**
+ tuple(>element_0<, >element_1<, ..., >element_n<): Return an n-tuple
+ @author: GameGeisha
+ @version: 1.2 (GMTuple)
+ */
+
+ //Position, address table and data
+ var pos, addr_table, data;
+ pos = 6*argument_count+4;
+ addr_table = "";
+ data = "";
+
+ //Build the tuple element-by-element
+ var i, ca, isstr, datastr;
+ for (i=0; ith element of
+ @author: GameGeisha
+ @version: 1.2 (GMTuple)
+ */
+
+ //Capture arguments
+ var t, n, size;
+ t = argument0;
+ n = argument1;
+ size = __jso_gmt_size(t);
+
+ //Search for the bounding positions for the th element in the address table
+ var start, afterend, isstr;
+ isstr = ord(string_char_at(t, 4+6*n))-$30;
+ start = real(string_copy(t, 5+6*n, 5));
+ if (n < size-1) {
+ afterend = real(string_copy(t, 11+6*n, 5));
+ } else {
+ afterend = string_length(t)+1;
+ }
+
+ //Return the th element with the correct type
+ if (isstr) {
+ return string_copy(t, start, afterend-start);
+ }
+ else {
+ return real(string_copy(t, start, afterend-start));
+ }
+
+}
+
+#define __jso_gmt_size
+{
+
+ /**
+ size(tuple_source): Return the size of
+ @author: GameGeisha
+ @version: 1.2 (GMTuple)
+ */
+
+ return real(string_copy(argument0, 1, 3));
+
+}
+
+#define __jso_gmt_numtostr
+{
+
+ /**
+ __gmt_numtostr(num): Return string representation of . Decimal numbers expressed as scientific notation
+ with double precision (i.e. 15 digits)
+ @author: GameGeisha
+ @version: 1.2 (edited)
+ */
+ if (frac(argument0) == 0) {
+ return string(argument0);
+ }
+
+ var mantissa, exponent;
+ exponent = floor(log10(abs(argument0)));
+ mantissa = string_format(argument0/power(10,exponent), 15, 14);
+ var i, ca;
+ i = string_length(mantissa);
+ do {
+ ca = string_char_at(mantissa, i);
+ i -= 1;
+ } until (ca != "0")
+ if (ca != ".") {
+ mantissa = string_copy(mantissa, 1, i+1);
+ }
+ else {
+ mantissa = string_copy(mantissa, 1, i);
+ }
+ if (exponent != 0) {
+ return mantissa + "e" + string(exponent);
+ }
+ else {
+ return mantissa;
+ }
+
+}
+
+#define __jso_gmt_test_all
+{
+
+ /**
+ test_all(): Runs all test suites
+ @author: GameGeisha
+ @version: 1.2 (GMTuple)
+ */
+
+ //Automated testing sequence
+ __jso_gmt_test_elem();
+ __jso_gmt_test_size();
+ __jso_gmt_test_numtostr();
+
+}
+
+#define __jso_gmt_test_numtostr
+{
+
+ /**
+ _test_numtostr(): Runs number-to-string tests
+ @author: GameGeisha
+ @version: 1.2 (GMTuple)
+ */
+
+ var tolerance;
+ tolerance = 1/10000000000;
+
+ if (real(__jso_gmt_numtostr(9)) != 9) {
+ show_message("Scientific notation conversion failed for 1-digit integer! Result: " + __jso_gmt_numtostr(9));
+ }
+ if (real(__jso_gmt_numtostr(500)) != 500) {
+ show_message("Scientific notation conversion failed for 3-digit integer! Result: " + __jso_gmt_numtostr(500));
+ }
+ if (abs(real(__jso_gmt_numtostr(pi))-pi) > tolerance) {
+ show_message("Scientific notation conversion failed for pi! Result: " + __jso_gmt_numtostr(pi));
+ }
+ if (abs(real(__jso_gmt_numtostr(104729.903455))-104729.903455) > tolerance) {
+ show_message("Scientific notation conversion failed for large decimal number! Result: " + __jso_gmt_numtostr(104729.903455));
+ }
+ if (abs(real(__jso_gmt_numtostr(-pi))+pi) > tolerance) {
+ show_message("Scientific notation conversion failed for -pi! Result: " + __jso_gmt_numtostr(-pi));
+ }
+ if (abs(real(__jso_gmt_numtostr(1/pi))-1/pi) > tolerance) {
+ show_message("Scientific notation conversion failed for 1/pi! Result: " + __jso_gmt_numtostr(1/pi));
+ }
+
+}
+
+#define __jso_gmt_test_elem
+{
+
+ /**
+ _test_elem(): Runs tuple element retrieval tests
+ @author: GameGeisha
+ @version: 1.2 (GMTuple)
+ */
+
+ if (__jso_gmt_elem(__jso_gmt_tuple("Qblock", "kll"), 0) != "Qblock") {
+ show_message("Element retrieval failed for simple string. #Should be:Qblock#Actual:" + __jso_gmt_elem(__jso_gmt_tuple("Qblock"), 0));
+ }
+ if (__jso_gmt_elem(__jso_gmt_tuple(9, "Q", -7), 0) != 9) {
+ show_message("Element retrieval failed for simple number. #Should be 9#Actual:" + string(__jso_gmt_elem(__jso_gmt_tuple(9, "Q", 7), 0)));
+ }
+ if (__jso_gmt_elem(__jso_gmt_tuple("Qblock", "", "Negg"), 1) != "") {
+ show_message("Element retrieval failed for empty string#Should be empty string#Actual:"+string(__jso_gmt_elem(__jso_gmt_tuple("Qblock", "", "Negg"), 0)));
+ }
+
+ if (__jso_gmt_elem(__jso_gmt_elem(__jso_gmt_tuple("Not this", __jso_gmt_tuple(0, 1, 2, 3), "Waahoo"), 1), 3) != 3) {
+ show_message("Element retrieval failed in nested tuple. #Should be 3#Actual:" + string(__jso_gmt_elem(__jso_gmt_elem(__jso_gmt_tuple("Not this", __jso_gmt_tuple(0, 1, 2, 3), "Waahoo"), 1), 3)));
+ }
+
+}
+
+#define __jso_gmt_test_size
+{
+
+ /**
+ _test_size(): Runs tuple size tests
+ @author: GameGeisha
+ @version: 1.2 (GMTuple)
+ */
+
+ if (__jso_gmt_size(__jso_gmt_tuple("Waahoo", "Negg", 0)) != 3) {
+ show_message("Bad size for 3-tuple");
+ }
+ if (__jso_gmt_size(__jso_gmt_tuple()) != 0) {
+ show_message("Bad size for null tuple");
+ }
+ if (__jso_gmt_size(__jso_gmt_tuple(7)) != 1) {
+ show_message("Bad size for 1-tuple");
+ }
+ if (__jso_gmt_size(__jso_gmt_tuple(1,2,3,4,5,6,7,8,9,10)) != 10) {
+ show_message("Bad size for 10-tuple");
+ }
+
+}
+
+#define jso_new_map
+{
+ /**
+ jso_new_map(): Create a new map.
+ JSOnion version: 1.0.0d
+ */
+ return ds_map_create();
+}
+
+#define jso_new_list
+{
+ /**
+ jso_new_list(): Create a new list.
+ JSOnion version: 1.0.0d
+ */
+ return ds_list_create();
+}
+
+#define jso_map_add_real
+{
+ /**
+ jso_map_add_real(map, key, val): Add the key-value pair : to