script engine bugfix, hitbox subtypes
This commit is contained in:
		
							parent
							
								
									e5a187ce19
								
							
						
					
					
						commit
						14d423d533
					
				| @ -95,7 +95,9 @@ const COMPILER_runFile = (fileName) => { | ||||
|         loggerScripts.INFO('RUN FILE ' + normalizedFilePath) | ||||
|         eval(COMPILER_fileMap[normalizedFilePath].content) | ||||
|     } else { | ||||
|         loggerScripts.WARNING('FAILED TO RESOLVE FILE ' + normalizedFilePath) | ||||
|         const message = 'FAILED TO RESOLVE FILE ' + normalizedFilePath | ||||
|         loggerScripts.WARNING(message) | ||||
|         throw new Error(message) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -108,6 +110,10 @@ const COMPILER_printSource = (fileName) => { | ||||
|     if(!!COMPILER_fileMap[normalizedFilePath]){ | ||||
|         loggerScripts.INFO('FILE CONTENT ' + normalizedFilePath) | ||||
|     } else { | ||||
|         loggerScripts.WARNING('FAILED TO RESOLVE FILE ' + normalizedFilePath) | ||||
|         const message = 'FAILED TO RESOLVE FILE ' + normalizedFilePath | ||||
|         loggerScripts.WARNING(message) | ||||
|         loggerScripts.WARNING('file map content:') | ||||
|         loggerScripts.WARNING(OBject.keys(COMPILER_fileMap) + "") | ||||
|         throw new Error(message) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -2,8 +2,20 @@ | ||||
| /** | ||||
|  * The host context that contains the core engine functions | ||||
|  */ | ||||
| export let HOST = { | ||||
| let HOST_ACCESS = { | ||||
|     classes: { }, //the classes available to the script engine
 | ||||
|     singletons: { }, //the singletons available to the script engine
 | ||||
| } | ||||
| 
 | ||||
| //fake require
 | ||||
| REQUIRE_CACHE["/compiler/host_access.js"] = { | ||||
|     exports: { | ||||
|         'HOST_ACCESS': HOST_ACCESS, | ||||
|         'loggerScripts': loggerScripts, | ||||
|     }, | ||||
|     exportedValues: [ | ||||
|         'HOST_ACCESS', | ||||
|         'loggerScripts' | ||||
|     ], | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -16,8 +16,9 @@ let exports = { } | ||||
|  * @param {*} cwd The current working directory | ||||
|  */ | ||||
| const require = (path) => { | ||||
|     loggerScripts.DEBUG('Require path ' + path) | ||||
|     let normalizedFilePath = FILE_RESOLUTION_getFilePath(path) | ||||
|     if(REQUIRE_CACHE[path]){ | ||||
|     if(!!REQUIRE_CACHE[normalizedFilePath]){ | ||||
|         return REQUIRE_CACHE[normalizedFilePath].exports | ||||
|     } else if(!!COMPILER_fileMap[normalizedFilePath]?.content) { | ||||
|         const code = COMPILER_fileMap[normalizedFilePath].moduleContent | ||||
| @ -31,6 +32,12 @@ const require = (path) => { | ||||
|         loggerScripts.INFO("[require] CREATE MODULE " + normalizedFilePath) | ||||
|         return module.exports | ||||
|     } else { | ||||
|         loggerScripts.WARNING("FAILED TO REQUIRE FILE " + normalizedFilePath) | ||||
|         const errorMsg = "FAILED TO REQUIRE FILE " + normalizedFilePath | ||||
|         loggerScripts.WARNING(errorMsg) | ||||
|         loggerScripts.WARNING('Module value:') | ||||
|         loggerScripts.WARNING(Object.keys(REQUIRE_CACHE?.[normalizedFilePath]) + '') | ||||
|         loggerScripts.WARNING('Require cache contents:') | ||||
|         loggerScripts.WARNING(Object.keys(REQUIRE_CACHE) + '') | ||||
|         throw new Error(errorMsg) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,11 @@ | ||||
| import { Host } from '/engine/engine-interface' | ||||
| import { loggerScripts } from '/compiler/host_access' | ||||
| 
 | ||||
| let host: Host | ||||
| 
 | ||||
| /** | ||||
|  * Called when the script engine first initializes | ||||
|  */ | ||||
| export const ENGINE_onInit = () => { | ||||
|     console.log('Script Engine Init') | ||||
|     loggerScripts.INFO('Script Engine Init') | ||||
| } | ||||
|  | ||||
| @ -17,9 +17,10 @@ Audio FX for everything | ||||
|  = Coding =  | ||||
| Sub menu on title screen that allows changing control mappings | ||||
|  - Automatically generate based on the controls arrays in controls handler | ||||
| Redo hitboxes to have capsules and also chaining between frames (but not between swinging the camera around) | ||||
|  - Introduce block hitbox (blockbox) type | ||||
|  - Sour spot, sweet spot for damage hitboxes and hurtboxes | ||||
| Review combat code | ||||
|  - Damage calculation | ||||
|  - Particle generation | ||||
|  - Revive tree | ||||
| Enemy AI | ||||
| Ability for private realms to have time start/stop based on the player's feedback <-- sync this up to tutorial ui via script | ||||
| Scene Message Service | ||||
|  | ||||
| @ -408,6 +408,9 @@ Audio | ||||
| 
 | ||||
| (06/02/2024) | ||||
| better scaffolding for scripting engine with hooks for equipping items, spawning entities, pausing/resuming play, etc | ||||
| Redo hitboxes to have capsules and also chaining between frames (but not between swinging the camera around) | ||||
|  - Introduce block hitbox (blockbox) type | ||||
|  - Sour spot, sweet spot for damage hitboxes and hurtboxes | ||||
| 
 | ||||
| # TODO | ||||
| 
 | ||||
|  | ||||
| @ -41,6 +41,15 @@ public class HitboxCollectionState { | ||||
|         BLOCK, // blocks a hit from another entity | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * The subtype of hitbox | ||||
|      */ | ||||
|     public enum HitboxSubtype { | ||||
|         SWEET, //extra damage | ||||
|         REGULAR, //regular damage | ||||
|         SOUR, //less damage | ||||
|     } | ||||
| 
 | ||||
|     //the parent entity of the hitbox state | ||||
|     Entity parent; | ||||
| 
 | ||||
| @ -86,6 +95,9 @@ public class HitboxCollectionState { | ||||
|             DGeom geom = null; | ||||
|             HitboxType type = HitboxType.HIT; | ||||
|             HitboxShapeType shapeType = HitboxShapeType.SPHERE; | ||||
|             // | ||||
|             //Get the type as an enum | ||||
|             // | ||||
|             switch(hitboxDataRaw.getType()){ | ||||
|                 case HitboxData.HITBOX_TYPE_HIT: { | ||||
|                     type = HitboxType.HIT; | ||||
| @ -113,11 +125,34 @@ public class HitboxCollectionState { | ||||
|                     geom = CollisionBodyCreation.createCapsuleShape(manager.getCollisionEngine(), hitboxDataRaw.getRadius(), hitboxDataRaw.getLength(), Collidable.TYPE_OBJECT_BIT); | ||||
|                 } break; | ||||
|             } | ||||
|             // | ||||
|             //Get the subtype as an enum | ||||
|             // | ||||
|             HitboxSubtype subType; | ||||
|             String subTypeRaw = hitboxDataRaw.getSubType(); | ||||
|             if(subTypeRaw == null){ | ||||
|                 subTypeRaw = HitboxData.HITBOX_SUBTYPE_REUGLAR; | ||||
|             } | ||||
|             switch(subTypeRaw){ | ||||
|                 case HitboxData.HITBOX_SUBTYPE_SWEET: { | ||||
|                     subType = HitboxSubtype.SWEET; | ||||
|                 } break; | ||||
|                 case HitboxData.HITBOX_SUBTYPE_REUGLAR: { | ||||
|                     subType = HitboxSubtype.REGULAR; | ||||
|                 } break; | ||||
|                 case HitboxData.HITBOX_SUBTYPE_SOUR: { | ||||
|                     subType = HitboxSubtype.SOUR; | ||||
|                 } break; | ||||
|                 default: { | ||||
|                     subType = HitboxSubtype.REGULAR; | ||||
|                 } break; | ||||
|             } | ||||
| 
 | ||||
|             if(hitboxDataRaw.getBone() != null){ | ||||
|                 rVal.hitboxGeomMap.put(hitboxDataRaw.getBone(),geom); | ||||
|             } | ||||
|             rVal.geoms.add(geom); | ||||
|             rVal.geomStateMap.put(geom,new HitboxState(hitboxDataRaw.getBone(), hitboxDataRaw, type, shapeType, true)); | ||||
|             rVal.geomStateMap.put(geom,new HitboxState(hitboxDataRaw.getBone(), hitboxDataRaw, type, subType, shapeType, true)); | ||||
|         } | ||||
| 
 | ||||
|         //create body with all the shapes | ||||
| @ -310,7 +345,7 @@ public class HitboxCollectionState { | ||||
|         worldPosition = worldPosition.rotate(rotation); | ||||
|         worldPosition.add(new Vector3f((float)parentPos.x,(float)parentPos.y,(float)parentPos.z)); | ||||
|         double length = shapeStatus.getHitboxData().getRadius(); | ||||
|         double radius = shapeStatus.getHitboxData().getRadius(); | ||||
|         // double radius = shapeStatus.getHitboxData().getRadius(); | ||||
| 
 | ||||
|         if(previousWorldPos != null){ | ||||
|             //called all subsequent updates to hitbox position | ||||
| @ -461,6 +496,9 @@ public class HitboxCollectionState { | ||||
|         //the type of hitbox | ||||
|         HitboxType type; | ||||
| 
 | ||||
|         //the subtype | ||||
|         HitboxSubtype subType; | ||||
| 
 | ||||
|         //the type of geometry | ||||
|         HitboxShapeType shapeType; | ||||
| 
 | ||||
| @ -481,13 +519,15 @@ public class HitboxCollectionState { | ||||
|          * @param boneName The name of the bone the hitbox is attached to, if any | ||||
|          * @param data the hitbox data object | ||||
|          * @param type The type of hitbox | ||||
|          * @param subType The subtype of hitbox | ||||
|          * @param shapeType The type of shape the hitbox is | ||||
|          * @param isActive if the hitbox is active or not | ||||
|          */ | ||||
|         public HitboxState(String boneName, HitboxData data, HitboxType type, HitboxShapeType shapeType, boolean isActive){ | ||||
|         public HitboxState(String boneName, HitboxData data, HitboxType type, HitboxSubtype subType, HitboxShapeType shapeType, boolean isActive){ | ||||
|             this.boneName = boneName; | ||||
|             this.data = data; | ||||
|             this.type = type; | ||||
|             this.subType = subType; | ||||
|             this.shapeType = shapeType; | ||||
|             this.isActive = isActive; | ||||
|         } | ||||
| @ -540,6 +580,22 @@ public class HitboxCollectionState { | ||||
|             this.type = type; | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * Gets the subtype of the hitbox | ||||
|          * @return The subtype | ||||
|          */ | ||||
|         public HitboxSubtype getSubType(){ | ||||
|             return subType; | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * Sets the subtype of the hitbox | ||||
|          * @param subType The subtype | ||||
|          */ | ||||
|         public void setSubType(HitboxSubtype subType){ | ||||
|             this.subType = subType; | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * Gets whether the hitbox is active or not | ||||
|          * @return true if active, false otherwise | ||||
|  | ||||
| @ -21,12 +21,23 @@ public class HitboxData { | ||||
|     //a block sphere that is connected to its previous position by a capsule. The capsule is used for collision checks | ||||
|     public static final String HITBOX_TYPE_BLOCK_CONNECTED = "block_connected"; | ||||
| 
 | ||||
|     //a hitbox with extra effect (ie more damage) | ||||
|     public static final String HITBOX_SUBTYPE_SWEET = "sweet"; | ||||
|     //a hitbox with normal effect | ||||
|     public static final String HITBOX_SUBTYPE_REUGLAR = "regular"; | ||||
|     //a hitbox with less effect (ie reduced damange) | ||||
|     public static final String HITBOX_SUBTYPE_SOUR = "sour"; | ||||
|      | ||||
| 
 | ||||
|     //used for debugging -- to show whether a hitbox is colliding with it or not | ||||
|     public static final String HITBOX_TYPE_STATIC_CAPSULE = "static_capsule"; | ||||
| 
 | ||||
|     //the type of hitbox | ||||
|     String type; | ||||
| 
 | ||||
|     //the subtype of hitbox (ie, sweetspot, sour spot, critical spot, armor spot, etc) | ||||
|     String subType; | ||||
| 
 | ||||
|     //the bone it is attached to | ||||
|     String bone; | ||||
| 
 | ||||
| @ -53,6 +64,14 @@ public class HitboxData { | ||||
|         return type; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Gets the subtype of the hitbox | ||||
|      * @return the subtype of hitbox | ||||
|      */ | ||||
|     public String getSubType() { | ||||
|         return subType; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Gets the type of bone | ||||
|      * @return the type of bone | ||||
| @ -101,10 +120,26 @@ public class HitboxData { | ||||
|         this.bone = bone; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Sets the type of the hitbox | ||||
|      * @param type the type | ||||
|      */ | ||||
|     public void setType(String type) { | ||||
|         this.type = type; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Sets the subtype of the hitbox | ||||
|      * @param subType the subtype | ||||
|      */ | ||||
|     public void setSubType(String subType) { | ||||
|         this.subType = subType; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Sets the radius of the hitbox | ||||
|      * @param radius The radius | ||||
|      */ | ||||
|     public void setRadius(float radius) { | ||||
|         this.radius = radius; | ||||
|     } | ||||
|  | ||||
| @ -46,6 +46,7 @@ public class Logger { | ||||
|      * This should be used for debugging messages that are executed on a given condition that won't necessarily be every loop (ie all network messages) | ||||
|      * @param message The message to report | ||||
|      */ | ||||
|     @Export | ||||
|     public void DEBUG(String message){ | ||||
|         if(level == LogLevel.LOOP_DEBUG || level == LogLevel.DEBUG){ | ||||
|             System.out.println(message); | ||||
|  | ||||
| @ -36,7 +36,7 @@ public class LoggerInterface { | ||||
|         loggerDB = new Logger(LogLevel.WARNING); | ||||
|         loggerAudio = new Logger(LogLevel.WARNING); | ||||
|         loggerUI = new Logger(LogLevel.WARNING); | ||||
|         loggerScripts = new Logger(LogLevel.WARNING); | ||||
|         loggerScripts = new Logger(LogLevel.DEBUG); | ||||
|         loggerStartup.INFO("Initialized loggers"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -101,7 +101,6 @@ public class ScriptEngine { | ||||
|         //call the engine initialization function | ||||
|         // invokeFunction("ENGINE_onInit"); | ||||
| 
 | ||||
|         System.exit(0); | ||||
| 
 | ||||
|         //read scripts into source map | ||||
|         // readScriptsDirectory("/src/main/sql", FileUtils.getAssetFile("/src/main/sql")); | ||||
| @ -271,8 +270,7 @@ public class ScriptEngine { | ||||
|      * Defines host members within javascript context | ||||
|      */ | ||||
|     private void defineHostMembers(){ | ||||
|         //remove top level members required for bootstrapping the engine | ||||
|         removeTopLevelValue("loggerScripts"); | ||||
|         hostObject = topLevelValue.getMember("HOST_ACCESS"); | ||||
|         //give guest access to static classes | ||||
|         Value classes = hostObject.getMember("classes"); | ||||
|         for(Object[] currentClass : staticClasses){ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user