Added protype scripts for Alternate Tank and Power Plant, changed naming convention of assets to: package -> name instead of: package -> model

This commit is contained in:
2019-09-25 22:01:03 -05:00
parent 19f5a0cd9c
commit eb7a7fc6d6
12 changed files with 101 additions and 40 deletions

View File

@@ -1,2 +1,5 @@
name: "Alternate Tank" name: "Alternate Tank"
model: "alternate_tank.obj" model: "alternate_tank.obj"
scripts: [
"vehicle"
]

View File

@@ -0,0 +1,9 @@
context Vehicle # Generic, Weapon
on.button_down(:interact) do |event|
if event.player.touching?(event.entity)
event.player.enter_vehicle
elsif event.player.driving?(event.entity) or event.player.passenger?(event.entity)
event.player.exit_vehicle
end
end

View File

@@ -2,10 +2,16 @@ name: "power_plant"
model: "power_plant.obj" model: "power_plant.obj"
collision: "mesh" collision: "mesh"
collision_mesh: null # Use model mesh for collision detection collision_mesh: null # Use model mesh for collision detection
scripts: [
"power_plant"
]
uses: uses:
- -
package: "base" package: "base"
model: "purchase_terminal" name: "purchase_terminal"
- -
package: "base" package: "base"
model: "information_panel" name: "information_panel"
-
package: "base"
name: "door"

View File

@@ -0,0 +1,8 @@
context Building
on.create do |event|
map.add_entity("base", "purchase_terminal", Vector.new(0, 1.5, 0), Vector.new(0, 90, 0), data: {team: event.entity.team})
map.add_entity("base", "information_panel", Vector.new(2, 1.5, 0), Vector.new(0, 0, 0))
map.add_entity("base", "door", Vector.new(2, 0, 6), Vector.new(0, 0, 0))
map.add_entity("base", "door", Vector.new(2, 0, 6), Vector.new(0, 180, 0))
end

View File

@@ -91,6 +91,7 @@ class IMICFPS
if @entity if @entity
@entity.orientation.y += delta @entity.orientation.y += delta
@entity.orientation.y %= 360.0
position_camera position_camera
else else
free_move free_move

View File

@@ -7,7 +7,7 @@ class IMICFPS
attr_reader :name, :bound_model, :first_person_view attr_reader :name, :bound_model, :first_person_view
def setup def setup
bind_model("base", "biped") bind_model
@collision = :dynamic @collision = :dynamic
@physics = true @physics = true

View File

@@ -17,7 +17,7 @@ class IMICFPS
@backface_culling = backface_culling @backface_culling = backface_culling
@name = @manifest.name @name = @manifest.name
@bound_model = map_entity ? bind_model(map_entity.package, map_entity.model) : nil @bound_model = map_entity ? bind_model : nil
@visible = true @visible = true
@renderable = true @renderable = true
@@ -32,7 +32,7 @@ class IMICFPS
# :static => does not move ever, # :static => does not move ever,
# :none => no collision check, entities can pass through # :none => no collision check, entities can pass through
@collision = :static @collision = :static
@physics = false # Entity affected by gravity and what not @physics = @manifest.physics # Entity affected by gravity and what not
@mass = 100 # kg @mass = 100 # kg
@delta_time = Gosu.milliseconds @delta_time = Gosu.milliseconds
@@ -56,7 +56,7 @@ class IMICFPS
@collidable.include?(@collision) @collidable.include?(@collision)
end end
def bind_model(package, name) def bind_model
model = ModelLoader.new(manifest: @manifest, entity: @dummy_entity) model = ModelLoader.new(manifest: @manifest, entity: @dummy_entity)
raise "model isn't a model!" unless model.is_a?(ModelLoader) raise "model isn't a model!" unless model.is_a?(ModelLoader)

View File

@@ -1,17 +1,19 @@
class IMICFPS class IMICFPS
class Manifest class Manifest
attr_reader :name, :model, :collision, :collision_mesh, :scripts, :uses attr_reader :name, :model, :collision, :collision_mesh, :physics, :scripts, :uses
def initialize(manifest_file: nil, package: nil, model: nil) def initialize(manifest_file: nil, package: nil, name: nil)
unless manifest_file unless manifest_file
raise "Entity package not specified!" unless package raise "Entity package not specified!" unless package
raise "Entity model not specified!" unless model raise "Entity name not specified!" unless name
manifest_file = "#{IMICFPS.assets_path}/#{package}/#{model}/manifest.yaml" manifest_file = "#{IMICFPS.assets_path}/#{package}/#{name}/manifest.yaml"
end end
raise "No manifest found at: #{manifest_file}" unless File.exist?(manifest_file) raise "No manifest found at: #{manifest_file}" unless File.exist?(manifest_file)
@file = manifest_file @file = manifest_file
parse(manifest_file) parse(manifest_file)
pp @scripts
end end
def parse(file) def parse(file)
@@ -24,12 +26,34 @@ class IMICFPS
# optional # optional
@collision = data["collision"] ? data["collision"] : nil @collision = data["collision"] ? data["collision"] : nil
@collision_mesh = data["collision_mesh"] ? data["collision_mesh"] : nil @collision_mesh = data["collision_mesh"] ? data["collision_mesh"] : nil
@scripts = data["scripts"] ? data["scripts"] : [] @physics = data["physics"] ? data["physics"] : false
@uses = data["uses"] ? data["uses"] : [] # List of entities that this Entity uses @scripts = data["scripts"] ? parse_scripts(data["scripts"]) : []
@uses = data["uses"] ? parse_dependencies(data["uses"]) : [] # List of entities that this Entity uses
end
def parse_scripts(scripts)
list = []
scripts.each do |script|
list << Script.new(script, File.read("#{file_path}/scripts/#{script}.rb"))
end
return list
end
def parse_dependencies(list)
dependencies = []
list.each do |item|
dependencies << Dependency.new(item["package"], item["name"])
end
return dependencies
end end
def file_path def file_path
File.expand_path("./../", @file) File.expand_path("./../", @file)
end end
Script = Struct.new(:name, :source)
Dependency = Struct.new(:package, :name)
end end
end end

View File

@@ -31,7 +31,7 @@ class IMICFPS
if section = data["terrain"] if section = data["terrain"]
@terrain.package = section["package"] @terrain.package = section["package"]
@terrain.model = section["model"] @terrain.name = section["name"]
@terrain.position = Vector.new @terrain.position = Vector.new
@terrain.orientation = Vector.new @terrain.orientation = Vector.new
if section["scale"] if section["scale"]
@@ -55,7 +55,7 @@ class IMICFPS
if section = data["skydome"] if section = data["skydome"]
@skydome.package = section["package"] @skydome.package = section["package"]
@skydome.model = section["model"] @skydome.name = section["name"]
@skydome.position = Vector.new @skydome.position = Vector.new
@skydome.orientation = Vector.new @skydome.orientation = Vector.new
if section["scale"] if section["scale"]
@@ -80,7 +80,7 @@ class IMICFPS
section.each do |ent| section.each do |ent|
entity = Map::Entity.new entity = Map::Entity.new
entity.package = ent["package"] entity.package = ent["package"]
entity.model = ent["model"] entity.name = ent["name"]
entity.position = Vector.new( entity.position = Vector.new(
ent["position"]["x"], ent["position"]["x"],
ent["position"]["y"], ent["position"]["y"],
@@ -132,7 +132,7 @@ class IMICFPS
end end
MetaData = Struct.new(:name, :gamemode, :authors, :datetime, :thumbnail, :description) MetaData = Struct.new(:name, :gamemode, :authors, :datetime, :thumbnail, :description)
Entity = Struct.new(:package, :model, :position, :orientation, :scale, :water_level, :scripts) Entity = Struct.new(:package, :name, :position, :orientation, :scale, :water_level, :scripts)
SpawnPoint = Struct.new(:team, :position, :orientation) SpawnPoint = Struct.new(:team, :position, :orientation)
end end
end end

View File

@@ -6,17 +6,17 @@ class IMICFPS
@collision_manager = CollisionManager.new(game_state: self) @collision_manager = CollisionManager.new(game_state: self)
@renderer = Renderer.new(game_state: self) @renderer = Renderer.new(game_state: self)
@map = @options[:map] @map = @options[:map]
add_entity(Terrain.new(map_entity: @map.terrain, manifest: Manifest.new(package: @map.terrain.package, model: @map.terrain.model))) add_entity(Terrain.new(map_entity: @map.terrain, manifest: Manifest.new(package: @map.terrain.package, name: @map.terrain.name)))
@draw_skydome = true @draw_skydome = true
@skydome = Skydome.new(map_entity: @map.skydome, manifest: Manifest.new(package: @map.skydome.package, model: @map.skydome.model), backface_culling: false) @skydome = Skydome.new(map_entity: @map.skydome, manifest: Manifest.new(package: @map.skydome.package, name: @map.skydome.name), backface_culling: false)
add_entity(@skydome) add_entity(@skydome)
@map.entities.each do |ent| @map.entities.each do |ent|
add_entity(Entity.new(map_entity: ent, manifest: Manifest.new(package: ent.package, model: ent.model))) add_entity(Entity.new(map_entity: ent, manifest: Manifest.new(package: ent.package, name: ent.name)))
end end
@player = Player.new(spawnpoint: @map.spawnpoints.sample, manifest: Manifest.new(package: "base", model: "biped")) @player = Player.new(spawnpoint: @map.spawnpoints.sample, manifest: Manifest.new(package: "base", name: "biped"))
add_entity(@player) add_entity(@player)
@camera = Camera.new(position: @player.position.clone) @camera = Camera.new(position: @player.position.clone)
@camera.attach_to(@player) @camera.attach_to(@player)

View File

@@ -14,10 +14,10 @@ class IMICFPS
@asset_index = 0 @asset_index = 0
# add_asset(:shader, nil, "default") # add_asset(:shader, nil, "default")
add_asset(:model, @map.terrain.package, @map.terrain.model) add_asset(:model, @map.terrain.package, @map.terrain.name)
add_asset(:model, @map.skydome.package, @map.skydome.model) add_asset(:model, @map.skydome.package, @map.skydome.name)
@map.entities.each do |entity| @map.entities.each do |entity|
add_asset(:model, entity.package, entity.model) add_asset(:model, entity.package, entity.name)
end end
add_asset(:model, "base", "biped") add_asset(:model, "base", "biped")
@@ -53,6 +53,7 @@ class IMICFPS
case hash[:type] case hash[:type]
when :model when :model
manifest = Manifest.new(manifest_file: IMICFPS.assets_path + "/#{hash[:package]}/#{hash[:name]}/manifest.yaml") manifest = Manifest.new(manifest_file: IMICFPS.assets_path + "/#{hash[:package]}/#{hash[:name]}/manifest.yaml")
add_required_assets(manifest)
ModelLoader.new(manifest: manifest, entity: @dummy_entity) ModelLoader.new(manifest: manifest, entity: @dummy_entity)
when :shader when :shader
Shader.new(name: hash[:name], vertex: "shaders/vertex/#{hash[:name]}.glsl", fragment: "shaders/fragment/#{hash[:name]}.glsl") Shader.new(name: hash[:name], vertex: "shaders/vertex/#{hash[:name]}.glsl", fragment: "shaders/fragment/#{hash[:name]}.glsl")
@@ -82,6 +83,15 @@ class IMICFPS
@assets << {type: type, package: package, name: name} @assets << {type: type, package: package, name: name}
end end
def add_required_assets(manifest)
manifest.uses.each do |dependency|
known = @assets.detect {|asset| asset[:package] == dependency.package && asset[:name] == dependency.name}
unless known
add_asset(:model, dependency.package, dependency.name)
end
end
end
def progressbar(x = window.width/4, y = window.height - 104) def progressbar(x = window.width/4, y = window.height - 104)
@percentage.draw @percentage.draw
progress = (@asset_index.to_f/@assets.count)*window.width/2 progress = (@asset_index.to_f/@assets.count)*window.width/2

View File

@@ -10,20 +10,20 @@
"terrain":{ "terrain":{
"package":"base", "package":"base",
"model":"river_terrain", "name":"river_terrain",
"water_level":null "water_level":null
}, },
"skydome":{ "skydome":{
"package":"base", "package":"base",
"model":"skydome", "name":"skydome",
"scale":0.08 "scale":0.08
}, },
"entities":[ "entities":[
{ {
"package":"base", "package":"base",
"model":"tree", "name":"tree",
"position": { "position": {
"x":0, "x":0,
"y":0.6, "y":0.6,
@@ -39,7 +39,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"tree", "name":"tree",
"position": { "position": {
"x":16.7, "x":16.7,
"y":1.1, "y":1.1,
@@ -55,7 +55,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"tree", "name":"tree",
"position": { "position": {
"x":-21.2121, "x":-21.2121,
"y":0.06, "y":0.06,
@@ -71,7 +71,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"power_plant", "name":"power_plant",
"position": { "position": {
"x":37.8788, "x":37.8788,
"y":0.343869, "y":0.343869,
@@ -87,7 +87,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"purchase_terminal", "name":"purchase_terminal",
"position": { "position": {
"x":37.8788, "x":37.8788,
"y":1.843869, "y":1.843869,
@@ -103,7 +103,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"information_panel", "name":"information_panel",
"position": { "position": {
"x":37.8788, "x":37.8788,
"y":0.343869, "y":0.343869,
@@ -119,7 +119,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"door", "name":"door",
"position": { "position": {
"x":37.8788, "x":37.8788,
"y":0.343869, "y":0.343869,
@@ -135,7 +135,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"door", "name":"door",
"position": { "position": {
"x":37.8788, "x":37.8788,
"y":0.343869, "y":0.343869,
@@ -151,7 +151,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"war_factory", "name":"war_factory",
"position": { "position": {
"x":39.3939, "x":39.3939,
"y":0.499657, "y":0.499657,
@@ -167,7 +167,7 @@
}, },
{ {
"package":"base", "package":"base",
"model":"alternate_tank", "name":"alternate_tank",
"position": { "position": {
"x":39.3939, "x":39.3939,
"y":0.799657, "y":0.799657,
@@ -200,13 +200,13 @@
{ {
"team":1, "team":1,
"position": { "position": {
"x": 37.8788, "x": 39.3939,
"y": 0.343869, "y": 0.799657,
"z": -4.06061 "z": 17.69697
}, },
"orientation": { "orientation": {
"x": 0, "x": 0,
"y": 180, "y": 0,
"z": 0 "z": 0
} }
} }