// This plugin was compiled from sapphirescript (v1.0 Beta) // sapphirescript by Nilo K. - Khas (arcthunder.blogspot.com/p/sapphire-script.html) if (!(Khas && Khas.Graphics && Khas.Graphics.version >= 1.1)) { var currentPlugin = "JsScript14Set"; var missingPlugin = "JsScript13Set"; var missingVersion = 1.1; alert("Please install " + (missingPlugin) + " v" + (missingVersion) + " in order to use " + (currentPlugin) + ""); }; Khas.Lighting = {}; Khas.Lighting.version = 4.2; Khas.Lighting.cache = {}; Khas.Lighting.Settings = {}; Khas.Lighting.Addons = {}; /*: * @plugindesc * * @author Nilo K. (Khas - arcthunder.blogspot.com) * * @param Custom Blending * @desc [ON/OFF] Uses a custom light blending equation. * This should match your game's graphic style. * @default ON * * @param Transfer Reset * @desc [ON/OFF] Ambient light is set to 100/ffffff after transfering. * @default OFF * * @param Auto Battle Lighting * @desc [ON/OFF] Battles' lighting will match the current * ambient light. Lights are added for battlers. * @default ON * * @requiredAssets img/lights/blue * @requiredAssets img/lights/blue2 * @requiredAssets img/lights/candle * @requiredAssets img/lights/cyan * @requiredAssets img/lights/flashlight_2 * @requiredAssets img/lights/flashlight_4 * @requiredAssets img/lights/flashlight_6 * @requiredAssets img/lights/flashlight_8 * @requiredAssets img/lights/fluorescent * @requiredAssets img/lights/green * @requiredAssets img/lights/halogen * @requiredAssets img/lights/ * @requiredAssets img/lights/pink2 * @requiredAssets img/lights/purple * @requiredAssets img/lights/red * @requiredAssets img/lights/test * @requiredAssets img/lights/torch * @requiredAssets img/lights/tungsten * @requiredAssets img/lights/tungsten2 * @requiredAssets img/lights/white * @requiredAssets img/lights/yellow * * @help */; Khas.Lighting.LIGHTS = { halogen: { fileName: "halogen", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, halogen_big: { fileName: "halogen", intensity: 100, variation: 0, size: 180, offset_x: 0, offset_y: 0 }, tungsten: { fileName: "tungsten", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, tungsten2: { fileName: "tungsten2", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, fluorescent: { fileName: "fluorescent", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, broken: { fileName: "halogen", intensity: 60, variation: 30, offset_x: 0, offset_y: 0 }, flashlight: { fileName: "flashlight", intensity: 100, variation: 0, offset_x: {2: 0, 4: 0, 6: 0, 8: 0 }, offset_y: {2: 0, 4: 0, 6: 0, 8: 0 }, syncWithDirection: true }, candle: { fileName: "candle", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, torch: { fileName: "torch", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, torch_big: { fileName: "torch", intensity: 80, variation: 20, size: 150, offset_x: 0, offset_y: 0 }, white_torch: { fileName: "white", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, red_torch: { fileName: "red", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, green_torch: { fileName: "green", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, blue_torch: { fileName: "blue", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, blue2_torch: { fileName: "blue2", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, pink_torch: { fileName: "pink", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, cyan_torch: { fileName: "cyan", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, yellow_torch: { fileName: "yellow", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, purple_torch: { fileName: "purple", intensity: 80, variation: 20, offset_x: 0, offset_y: 0 }, white: { fileName: "white", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white0: { fileName: "white0", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white1: { fileName: "white1", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white2: { fileName: "white2", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white3: { fileName: "white3", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white4: { fileName: "white4", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white5: { fileName: "white5", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white6: { fileName: "white6", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white7: { fileName: "white7", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white8: { fileName: "white8", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white9: { fileName: "white9", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white10: { fileName: "white10", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white11: { fileName: "white11", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, white12: { fileName: "white12", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, red: { fileName: "red", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, green: { fileName: "green", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, blue: { fileName: "blue", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, pink: { fileName: "pink", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, pink2: { fileName: "pink2", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, cyan: { fileName: "cyan", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, yellow: { fileName: "yellow", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, purple: { fileName: "purple", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, test: { fileName: "test", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, /* In order to create custom lights, copy any of the lights above and add them below. Check the two templates explained here and edit the copied light to achieve the effect you're looking for. If you want to use new light images, make sure to add the following line after the other requiredAssets tags: @requiredAssets img/lights/the_light_name This line is responsible of importing the resource correctly into your project, including it when packaging. Template 1: How a simple light is created. Please note that the sum of intensity and variation must be equal or less than 100. halogen: { fileName: "halogen", intensity: 100, variation: 0, offset_x: 0, offset_y: 0 }, Template 2: How a flashlight is created. The offsets for every direction are optional - if they are the same for all directions, please use the offset as the template above. For lights that sync with direction, you must have 4 images for each direction (with the same size), each one ending with _2, _4, _6 or _8. See the flashlight images as an example! flashlight: { fileName: "flashlight", intensity: 100 variation: 0, offset_x: {2: -12, 4: -72, 6: 72, 8: 16 }, offset_y: {2: 72, 4: 0, 6: 16, 8: -72 }, syncWithDirection: true }, Since version 2.1, a new parameter can be added: size It must be an integer greater than 0 (default 100). See halogen_big or torch_big for an example. Since version 4.0, a new parameter can be added: cast_shadows It must be set to true or false (default: true) PLACE YOUR CUSTOM LIGHTS HERE: */ }; Khas.Lighting.PARAMETERS = PluginManager.parameters("JsScript14Set"); Khas.Lighting.Settings.CUSTOM_BLEND_MODE = Khas.Lighting.PARAMETERS["Custom Blending"].toLowerCase() == "on"; Khas.Lighting.Settings.TRANSFER_RESET = Khas.Lighting.PARAMETERS["Transfer Reset"].toLowerCase() == "on"; Khas.Lighting.Settings.AUTO_BATTLE_LIGHTING = Khas.Lighting.PARAMETERS["Auto Battle Lighting"].toLowerCase() == "on"; function PixiOutOfDateError() { this.initialize.apply(this, arguments); }; PixiOutOfDateError.prototype = Object.create(Error.prototype); PixiOutOfDateError.prototype.constructor = PixiOutOfDateError; PixiOutOfDateError.prototype.initialize = function() { this.name = "Pixi.js out of date!"; this.message = "Please update your RPG Maker MV and your project js folder in order to use Khas Advanced Graphics. It requires Pixi.js v3 or later."; this.stack = (new Error()).stack; }; ImageManager.loadLight = function(filename) { return this.loadBitmap("img/lights/", filename, 0, true);; }; Graphics.kal_createRenderer = Graphics._createRenderer; Graphics._createRenderer = function() { this.kal_createRenderer(); if (typeof PIXI.BLEND_MODES != 'undefined') { var gl = this._renderer.gl; PIXI.BLEND_MODES.KHAS_LIGHT = 31; PIXI.BLEND_MODES.KHAS_LIGHTING = 32; this._renderer.state.blendModes[PIXI.BLEND_MODES.KHAS_LIGHT] = [gl.SRC_ALPHA, gl.ONE]; this._renderer.state.blendModes[PIXI.BLEND_MODES.KHAS_LIGHTING] = [gl.ZERO, gl.SRC_COLOR]; } else { throw new PixiOutOfDateError(); }; }; Object.defineProperty(Game_Map.prototype, 'lighting', { get: function() { return this._lighting; }, }); Object.defineProperty(Game_Map.prototype, 'battleLighting', { get: function() { return this._battleLighting; }, }); Object.defineProperty(Game_Map.prototype, 'tileLights', { get: function() { return this._tileLights; }, }); Game_Map.prototype.kal_initialize = Game_Map.prototype.initialize; Game_Map.prototype.kal_khasSetupMap = Game_Map.prototype.khasSetupMap; Game_Map.prototype.kal_khasExtendSetup = Game_Map.prototype.khasExtendSetup; Game_Map.prototype.kal_callKhasCommand = Game_Map.prototype.callKhasCommand; Game_Map.prototype.kal_callKhasTilesetCommand = Game_Map.prototype.callKhasTilesetCommand; Game_Map.prototype.kal_khasPostScan = Game_Map.prototype.khasPostScan; Game_Map.prototype.initialize = function() { this._lighting = new Game_Lighting(); this._battleLighting = new Game_Lighting(); this.kal_initialize(); }; Game_Map.prototype.khasSetupMap = function() { this._terrainTagLights = {}; this._regionTagLights = {}; this._tileLights = []; if (Khas.Lighting.Settings.TRANSFER_RESET) this._lighting.setAmbientLight("ffffffff"); this.kal_khasSetupMap(); }; Game_Map.prototype.khasExtendSetup = function() { this.genHeightMap(); this.genShadowCasters(); }; Game_Map.prototype.callKhasCommand = function(command, value1, value2) { switch (command) { case "ambient_light": var switchId = Number(value2 || ""); var target = value1; if (!(target.length == 6 || target.length == 8)) target = Number(target); if (switchId > 0) { if ($gameSwitches.value(switchId)) this._lighting.setAmbientLight(target); } else { if (this._lighting.autoAmbientLight) this._lighting.setAmbientLight(target); }; break; case "region_light": this._regionTagLights[value1] = value2; break; default: this.kal_callKhasCommand(command, value1, value2); }; }; Game_Map.prototype.callKhasTilesetCommand = function(command, value1, value2) { if (command == "tag_light") { this._terrainTagLights[value1] = value2; } else { this.kal_callKhasTilesetCommand(command, value1, value2); }; }; Game_Map.prototype.khasPostScan = function() { this.kal_khasPostScan(); this.scanMapLights(); }; Game_Map.prototype.scanMapLights = function() { var width = $dataMap.width; var height = $dataMap.height; var lightId = ""; for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { lightId = this._regionTagLights[this.regionId(x, y)]; if (lightId) { if (Khas.Lighting.LIGHTS[lightId]) { this.addTileLight(x, y, lightId); } else { alert("Light not found: " + (lightId) + "\nCheck the region tags"); }; } else { lightId = this._terrainTagLights[this.terrainTag(x, y)]; if (lightId) { if (Khas.Lighting.LIGHTS[lightId]) { this.addTileLight(x, y, lightId); } else { alert("Light not found: " + (lightId) + "\nCheck the tileset's terrain tags"); }; }; }; }; }; }; Game_Map.prototype.addTileLight = function(x, y, lightId) { this._tileLights.push(new Game_LightTile(x, y, lightId)); }; Game_Map.prototype.getHeight = function(x, y) { return this.isValid(x, y) ? this._heightMap[x][y] : null; }; Game_Map.prototype.setHeight = function(x, y, h) { this._heightMap[x][y] = h; }; Game_Map.prototype.isWall = function(x, y) { return this.getHeight(x, y) % 2 == 1; }; Game_Map.prototype.isFloor = function(x, y) { return this.getHeight(x, y) % 2 == 0; }; Game_Map.prototype.genHeightMap = function() { this._heightMap = []; for (var x = 0; x < this.width(); x++) { this._heightMap.push([]); for (var y = 0; y < this.height(); y++) { var h = Math.floor(this.regionId(x, y) / 10) * 2; this._heightMap[x].push(h); }; }; for (var x = 0; x < this.width(); x++) { for (var y = 0; y < this.height(); y++) { var h = this._heightMap[x][y]; var nh = this.getHeight(x, y + 1); if (h > 0 && this.isFloor(x, y) && h > nh) { h -= 1; var dy = 1; while (h > 0 && (nh == 0 || h - 1 > nh) && this.isValid(x, y + dy)) { this.setHeight(x, y + dy, h); h -= 2; dy += 1; if (this.isValid(x, y + dy)) nh = this.getHeight(x, y + dy); }; }; }; }; }; Game_Map.prototype.addCaster = function(x, y, caster) { if (this.isValid(x, y)) this._shadowCasters[x][y].push(caster); }; Game_Map.prototype.genShadowCasters = function() { this._shadowCasters = []; for (var x = 0; x < this.width(); x++) { this._shadowCasters.push([]); for (var y = 0; y < this.height(); y++) { this._shadowCasters[x].push([]); }; }; for (var x = 0; x < this.width(); x++) { for (var y = 0; y < this.height(); y++) { var h = this._heightMap[x][y]; if (h > 0 && h % 2 == 0) { if (this.getHeight(x, y+1) < h) { this.addCaster(x, y, new Khas_SCFB(x, y, h)); var dy = 1; while (this.isValid(x, y + dy) && this.getHeight(x, y+dy) > this.getHeight(x-1, y+dy) && this.isWall(x, y+dy)) { dy += 1; }; for (var iy = 1; iy < dy; iy++) { this.addCaster(x, y+iy, new Khas_SCWL(x, y+1, y+dy)); }; dy = 1; while (this.isValid(x, y + dy) && this.getHeight(x, y+dy) > this.getHeight(x+1, y+dy) && this.isWall(x, y+dy)) { dy += 1; }; for (var iy = 1; iy < dy; iy++) { this.addCaster(x, y+iy, new Khas_SCWR(x, y+1, y+dy)); }; }; if (this.getHeight(x, y - 1) < h) this.addCaster(x, y, new Khas_SCFT(x, y, h)); if (this.getHeight(x - 1, y) < h) this.addCaster(x, y, new Khas_SCFL(x, y, h)); if (this.getHeight(x + 1, y) < h) this.addCaster(x, y, new Khas_SCFR(x, y, h)); }; if (!(this._shadowCasters[x][y].length > 0)) this._shadowCasters[x][y] = null; }; }; }; Game_Map.prototype.getShadowCasters = function(x, y) { if (this.isValid(x, y)) { return this._shadowCasters[x][y]; } else { return null; }; }; Object.defineProperty(Game_CharacterBase.prototype, 'light_id', { get: function() { return this._light_id; }, }); Object.defineProperty(Game_CharacterBase.prototype, 'light_ox', { get: function() { return this._light_ox; }, }); Object.defineProperty(Game_CharacterBase.prototype, 'light_oy', { get: function() { return this._light_oy; }, }); Object.defineProperty(Game_CharacterBase.prototype, 'light_size', { get: function() { return this._light_size; }, }); Object.defineProperty(Game_CharacterBase.prototype, 'light_transition', { get: function() { return this._light_transition; }, }); Object.defineProperty(Game_CharacterBase.prototype, 'cast_shadows', { get: function() { return this._cast_shadows; }, }); Game_CharacterBase.prototype.kal_initialize = Game_CharacterBase.prototype.initialize; Game_CharacterBase.prototype.initialize = function() { this.kal_initialize(); this.clearLight(); }; Game_CharacterBase.prototype.setLight = function(lightId, transition) { this.clearLight(); this._light_transition = (transition ? transition : null); if (lightId) { if (Khas.Lighting.LIGHTS[lightId]) { this.registerLight(lightId); } else { alert("Light not found: " + (lightId) + ""); }; }; }; Game_CharacterBase.prototype.registerLight = function(lightId) { this._light_id = lightId; }; Game_CharacterBase.prototype.clearLight = function() { this._light_id = null; this._light_ox = null; this._light_oy = null; this._light_size = null; this._light_transition = null; this._cast_shadows = null; }; Game_CharacterBase.prototype.hasLight = function() { return this._light_id ? true : false; }; Game_CharacterBase.prototype.lightScreenX = function() { return Math.round(($gameMap.adjustX(this._realX) + 0.5) * $gameMap.tileWidth() + $gameScreen.shake()); }; Game_CharacterBase.prototype.lightScreenY = function() { return Math.round(($gameMap.adjustY(this._realY) + 0.5) * $gameMap.tileHeight()); }; Game_CharacterBase.prototype.lightHeight = function() { return $gameMap.getHeight(this._x, this._y); }; Game_Player.prototype.registerLight = function(lightId) { Game_Character.prototype.registerLight.call(this, lightId); if ($khasGraphics.lighting) $khasGraphics.lighting.addPlayer(); }; Game_Event.prototype.kal_khasExtendSetup = Game_Event.prototype.khasExtendSetup; Game_Event.prototype.kal_callKhasCommand = Game_Event.prototype.callKhasCommand; Game_Event.prototype.khasExtendSetup = function() { this.kal_khasExtendSetup(); this.clearLight(); }; Game_Event.prototype.callKhasCommand = function(command, value1, value2) { switch (command) { case "light": this.setLight(value1); break; case "light_offset": this._light_ox = Number(value1); this._light_oy = Number(value2); break; case "light_size": this._light_size = Number(value1); break; case "smooth_light": this.setLight(value1, Number(value2)); break; case "light_shadows": if (value1.toLowerCase() == "on") this._cast_shadows = true; if (value1.toLowerCase() == "off") this._cast_shadows = false; break; default: this.kal_callKhasCommand(command, value1, value2); }; }; Game_Event.prototype.registerLight = function(lightId) { Game_Character.prototype.registerLight.call(this, lightId); if ($khasGraphics.lighting) $khasGraphics.lighting.addEvent(this); }; Game_Interpreter.prototype.kal_pluginCommand = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function(command, args) { if (!(command)) return; args = args || []; switch (command.toLowerCase()) { case "lighting": var state = (args[0] || "").toLowerCase(); if (state == "on") $gameMap.lighting.enable(); if (state == "off") $gameMap.lighting.disable(); break; case "ambientlight": var target = args[0] || "100"; if (!(target.length == 6 || target.length == 8)) target = Number(target); var time = Number(args[1] || "0"); $gameMap.lighting.setAmbientLight(target, time); //$gameMap.battleLighting.setAmbientLight(target) if Khas.Lighting.Settings.AUTO_BATTLE_AL break; case "autoambientlight": var state =(args[0] || "").toLowerCase(); if (state == "on") $gameMap.lighting.autoAmbientLight = true; if (state == "off") $gameMap.lighting.autoAmbientLight = false; break; case "saveambientlight": var stateName = args[0] || ""; $gameMap.lighting.saveState(stateName); break; case "loadambientlight": var stateName = args[0] || ""; var time = Number(args[1] || "0"); $gameMap.lighting.loadState(stateName, time); break; case "playerlantern": var lightId = args[0] || ""; if (lightId.toLowerCase() == "off") { $gamePlayer.setLight(null) ; } else { $gamePlayer.setLight(lightId); }; break; case "setactorlight": var actorId = Number(args[0] || "0"); var lightId = args[1] || null; var ox = Number(args[2] || "0"); var oy = Number(args[3] || "0") ; if (actorId && lightId) $gameMap.battleLighting.setBattlerLight("actor", actorId, lightId, ox, oy); break; case "setenemylight": var enemyId = Number(args[0] || "0"); var lightId = args[1] || null; var ox = Number(args[2] || "0"); var oy = Number(args[3] || "0") ; if (enemyId && lightId) $gameMap.battleLighting.setBattlerLight("enemy", enemyId, lightId, ox, oy); break; case "battlelighting": var battleCommand = args[0] || ""; switch (battleCommand.toLowerCase()) { case "reset": $gameMap.battleLighting.resetLighting(); break; case "ambientlight": var target = args[1] || "100"; if (!(target.length == 6 || target.length == 8)) target = Number(target); $gameMap.battleLighting.setAmbientLight(target); break; case "addlight": var lightId = args[1] || ""; var x = Number(args[2] || ""); var y = Number(args[3] || ""); if (Khas.Lighting.LIGHTS[lightId]) { $gameMap.battleLighting.addLightPoint(new Game_LightPoint(x, y, lightId)); } else { alert("Light not found: " + (lightId) + "\nCheck your plugin commands."); }; break; }; break; default: this.kal_pluginCommand(command, args); }; }; function Game_Lighting() { this.initialize.apply(this, arguments); }; Object.defineProperty(Game_Lighting.prototype, 'enabled', { get: function() { return this._enabled; }, }); Object.defineProperty(Game_Lighting.prototype, 'ambientLight', { get: function() { return this._ambientLight; }, }); Object.defineProperty(Game_Lighting.prototype, 'lightPoints', { get: function() { return this._lightPoints; }, }); Object.defineProperty(Game_Lighting.prototype, 'battlerLightIds', { get: function() { return this._battlerLightIds; }, }); Object.defineProperty(Game_Lighting.prototype, 'autoAmbientLight', { get: function() { return this._autoAmbientLight; }, set: function(value) { this._autoAmbientLight = value; }}); Game_Lighting.prototype.initialize = function() { this._enabled = true; this._ambientLight = new Khas_AmbientLight(); this._autoAmbientLight = true; this._savedStates = {}; this._battlerLightIds = {"actor": {}, "enemy": {}}; this.resetLighting(); }; Game_Lighting.prototype.resetLighting = function() { this._ambientLight.reset(); this._lightPoints = []; this._lightBattlers = []; }; Game_Lighting.prototype.update = function() { if (!(this._enabled)) return; this._ambientLight.update(); }; Game_Lighting.prototype.enable = function() { this.setState(true); }; Game_Lighting.prototype.disable = function() { this.setState(false); }; Game_Lighting.prototype.setState = function(enabled) { this._enabled = enabled; }; Game_Lighting.prototype.setAmbientLight = function(target, time) { if (typeof target == "string") { color = /^#?([a-f\d]{2})?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(target); if (color) { var i = color[1] ? (parseInt(color[1], 16)) / 255 : null; var r = (parseInt(color[2], 16)) / 255; var g = (parseInt(color[3], 16)) / 255; var b = (parseInt(color[4], 16)) / 255; this._ambientLight.set(i, time, r, g, b); }; } else { var i = target.clamp(0, 100) / 100; this._ambientLight.set(i, time); }; }; Game_Lighting.prototype.addLightPoint = function(lightPoint) { this._lightPoints.push(lightPoint); }; Game_Lighting.prototype.clearLightPoints = function() { this._lightPoints = []; }; Game_Lighting.prototype.saveState = function(stateName) { this._savedStates[stateName] = { "enabled": this._enabled, "ambientLight": { "intensity": this._ambientLight.intensity, "red": this._ambientLight.red, "green": this._ambientLight.green, "blue": this._ambientLight.blue }, "autoAmbientLight": this._autoAmbientLight }; }; Game_Lighting.prototype.loadState = function(stateName, time) { if (stateName in this._savedStates) { this._enabled = this._savedStates[stateName]["enabled"]; i = this._savedStates[stateName]["ambientLight"]["intensity"]; r = this._savedStates[stateName]["ambientLight"]["red"]; g = this._savedStates[stateName]["ambientLight"]["green"]; b = this._savedStates[stateName]["ambientLight"]["blue"]; this._ambientLight.set(i, time, r, g, b); this._autoAmbientLight = this._savedStates[stateName]["autoAmbientLight"]; }; }; Game_Lighting.prototype.copyAmbientLight = function(gameLighting) { i = gameLighting.ambientLight.intensity; r = gameLighting.ambientLight.red; g = gameLighting.ambientLight.green; b = gameLighting.ambientLight.blue; this._ambientLight.set(i, 0, r, g, b); }; Game_Lighting.prototype.addLightBattler = function(lightBattler) { this._lightBattlers.push(lightBattler); }; Game_Lighting.prototype.clearLightBattlers = function() { this._lightBattlers = []; }; Game_Lighting.prototype.updateLightBattlers = function() { for (var i = 0; i < this._lightBattlers.length; i++) { this._lightBattlers[i].update(); }; }; Game_Lighting.prototype.setBattlerLight = function(type, battlerId, lightId, offset_x, offset_y) { this._battlerLightIds[type][battlerId] = { id: lightId, ox: offset_x, oy: offset_y }; }; function Game_LightPoint() { this.initialize.apply(this, arguments); }; Object.defineProperty(Game_LightPoint.prototype, 'light_id', { get: function() { return this._light_id; }, }); Object.defineProperty(Game_LightPoint.prototype, 'light_ox', { get: function() { return this._light_ox; }, }); Object.defineProperty(Game_LightPoint.prototype, 'light_oy', { get: function() { return this._light_oy; }, }); Object.defineProperty(Game_LightPoint.prototype, 'light_size', { get: function() { return this._light_size; }, }); Object.defineProperty(Game_LightPoint.prototype, 'light_transition', { get: function() { return this._light_transition; }, }); Object.defineProperty(Game_LightPoint.prototype, 'cast_shadows', { get: function() { return this._cast_shadows; }, }); Game_LightPoint.prototype.initialize = function(screenX, screenY, light_id) { this._screenX = screenX; this._screenY = screenY; this._direction = 2; this._light_id = light_id; this._light_ox = null; this._light_oy = null; this._light_size = null; this._light_transition = null; this._cast_shadows = false; }; Game_LightPoint.prototype.lightScreenX = function() { return this._screenX; }; Game_LightPoint.prototype.lightScreenY = function() { return this._screenY; }; Game_LightPoint.prototype.khasType = function() { return "point"; }; function Game_LightTile() { this.initialize.apply(this, arguments); }; Object.defineProperty(Game_LightTile.prototype, 'light_id', { get: function() { return this._light_id; }, }); Object.defineProperty(Game_LightTile.prototype, 'light_ox', { get: function() { return this._light_ox; }, }); Object.defineProperty(Game_LightTile.prototype, 'light_oy', { get: function() { return this._light_oy; }, }); Object.defineProperty(Game_LightTile.prototype, 'light_size', { get: function() { return this._light_size; }, }); Object.defineProperty(Game_LightTile.prototype, 'light_transition', { get: function() { return this._light_transition; }, }); Object.defineProperty(Game_LightTile.prototype, 'cast_shadows', { get: function() { return this._cast_shadows; }, }); Game_LightTile.prototype.initialize = function(x, y, light_id) { this._x = x; this._y = y; this._realX = x + 0.5; this._realY = y + 0.5; this._direction = 2; this._light_id = light_id; this._light_ox = null; this._light_oy = null; this._light_size = null; this._light_transition = null; this._cast_shadows = null; }; Game_LightTile.prototype.lightScreenX = function() { return Math.round($gameMap.adjustX(this._realX) * $gameMap.tileWidth() + $gameScreen.shake()); }; Game_LightTile.prototype.lightScreenY = function() { return Math.round($gameMap.adjustY(this._realY) * $gameMap.tileHeight()); }; Game_LightTile.prototype.lightHeight = function() { return $gameMap.getHeight(this._x, this._y); }; Game_LightTile.prototype.khasType = function() { return "tile"; }; function Game_LightBattler() { this.initialize.apply(this, arguments); }; Object.defineProperty(Game_LightBattler.prototype, 'light_id', { get: function() { return this._light_id; }, }); Object.defineProperty(Game_LightBattler.prototype, 'light_ox', { get: function() { return this._light_ox; }, }); Object.defineProperty(Game_LightBattler.prototype, 'light_oy', { get: function() { return this._light_oy; }, }); Object.defineProperty(Game_LightBattler.prototype, 'light_size', { get: function() { return this._light_size; }, }); Object.defineProperty(Game_LightBattler.prototype, 'light_transition', { get: function() { return this._light_transition; }, }); Object.defineProperty(Game_LightBattler.prototype, 'cast_shadows', { get: function() { return this._cast_shadows; }, }); Game_LightBattler.prototype.initialize = function(battlerSprite, type) { this._battlerSprite = battlerSprite; this._type = type; this._battler = null; this._direction = 2; this._light_id = null; this._light_ox = null; this._light_oy = null; this._light_size = null; this._light_transition = 1; this._cast_shadows = false; }; Game_LightBattler.prototype.findLightProperties = function() { if (this._battler) { var id = 0; if (this._type == "actor") { id = this._battler._actorId; } else { id = this._battler._enemyId; }; var lightProperties = $gameMap.battleLighting.battlerLightIds[this._type][id]; if (lightProperties) { if (Khas.Lighting.LIGHTS[lightProperties.id]) { return lightProperties; } else { return null; }; } else { return null; }; } else { return null; }; }; Game_LightBattler.prototype.update = function() { if (this._battler != this._battlerSprite._battler) { this._battler = this._battlerSprite._battler; var lightProperties = this.findLightProperties(); if (this._battler && lightProperties) { this._light_id = lightProperties.id; this._light_ox = lightProperties.ox; this._light_oy = lightProperties.oy; this.registerLight(); }; }; if (this._battler && this._battler.hp <= 0) { this._light_id = null; }; }; Game_LightBattler.prototype.registerLight = function() { if ($khasGraphics.lighting && this._light_id) $khasGraphics.lighting.addCharacter(this); }; Game_LightBattler.prototype.lightScreenX = function() { return this._battlerSprite.x; }; Game_LightBattler.prototype.lightScreenY = function() { return this._battlerSprite.y; }; Game_LightBattler.prototype.khasType = function() { return "battler"; }; function Sprite_Light() { this.initialize.apply(this, arguments); }; Sprite_Light.prototype = Object.create(Khas_Sprite.prototype); Sprite_Light.prototype.constructor = Sprite_Light; Object.defineProperty(Sprite_Light.prototype, 'id', { get: function() { return this._id; }, }); Object.defineProperty(Sprite_Light.prototype, 'screenX', { get: function() { return this._screenX; }, }); Object.defineProperty(Sprite_Light.prototype, 'screenY', { get: function() { return this._screenY; }, }); Object.defineProperty(Sprite_Light.prototype, 'h', { get: function() { return this._h; }, }); Object.defineProperty(Sprite_Light.prototype, 'character', { get: function() { return this._character; }, }); Object.defineProperty(Sprite_Light.prototype, 'shadow', { get: function() { return this._shadow; }, }); Sprite_Light.prototype.initialize = function(character) { Khas_Sprite.prototype.initialize.call(this); this._id = null; this._character = character; this._width = 0; this._height = 0; this._screenX = 0; this._screenY = 0; this._h = 0; this._last_crx = null; this._last_cry = null; this._initialized = false; this._light = null; this._shadow = null; this._renderedLight = null; this.blendMode = Khas.Lighting.Settings.CUSTOM_BLEND_MODE ? PIXI.BLEND_MODES.KHAS_LIGHT : PIXI.BLEND_MODES.SCREEN; this.anchor.x = 0.5; this.anchor.y = 0.5; }; Sprite_Light.prototype.isReadyForInitialization = function(id) { var cachedBitmap = this.getCachedBitmap(id); return cachedBitmap.width > 0 && cachedBitmap.height > 0; }; Sprite_Light.prototype.isValid = function() { return this._id ? true : false; }; Sprite_Light.prototype.deleted = function() { return !this._id && this._initialized; }; Sprite_Light.prototype.initializeLight = function(id) { if (!(id)) { this._id = null; return; }; if (!(this.isReadyForInitialization(id))) return; this._initialized = true; this._id = id; this._character_ox = null; this._character_oy = null; this._character_size = null; this._character_shadows = null; this._last_direction = 0; var data = this.getData(this._id); var cachedBitmap = this.getCachedBitmap(this._id); this._width = cachedBitmap.width; this._height = cachedBitmap.height; this._intensity = data.intensity.clamp(0, 100); var c = 100 - (this._intensity + data.variation); this._variation = (c < 0 ? (data.variation + c) : data.variation); this._dynamic_intensity = (this._variation > 0); this._syncWithDirection = data.syncWithDirection ? true : false; this._ox = data.offset_x; this._oy = data.offset_y; if (this._syncWithDirection && typeof(this._ox) != "object") this._ox = {2: this._ox, 4: this._ox, 6: this._ox, 8: this._ox }; if (this._syncWithDirection && typeof(this._oy) != "object") this._oy = {2: this._oy, 4: this._oy, 6: this._oy, 8: this._oy }; this._current_scale = 1.0; this.setSize(Number(data.size ? data.size : 100)); this._transition = this._character.light_transition; if (this._transition && this._transition <= 0) this._transition = null; this._target_intensity = this._intensity; if (this._transition) { this._intensity = 0; this._transition_up = true; this._dynamic_intensity = true; }; this._castShadows = null; this.setRendering(data.cast_shadows); }; Sprite_Light.prototype.setSize = function(size) { if (!(size > 0)) size = 100; size /= 100.0; this.scale.x = size; this.scale.y = size; this._current_scale = this.scale.x; }; Sprite_Light.prototype.setRendering = function(castShadows) { var newCastShadows = (castShadows != null ? castShadows : true); if (this._castShadows == newCastShadows) return; this._castShadows = newCastShadows; if (this._castShadows) { this._light = new Sprite(this.getCachedBitmap(this._id)); this._shadow = new Khas_Shadow(); this._shadow.resize(this._width, this._height); this._light.addChild(this._shadow.mask); this._shadow.mask.x = this._width / 2; this._shadow.mask.y = this._height / 2; this._renderedLight = new PIXI.RenderTexture.create(this._width, this._height); this.texture = this._renderedLight; if (this._current_scale != 1.0) this.setSize(this._current_scale * 100); this._last_crx = null; this._last_cry = null; } else { this._light = null; this._shadow = null; this._renderedLight = null; this.texture = new PIXI.Texture(this.getCachedBitmap(this._id).baseTexture); }; }; Sprite_Light.prototype.getCachedBitmap = function(id, d) { d = d || 2; var cached = Khas.Lighting.cache[id]; if (cached.hasOwnProperty(d)) { return cached[d]; } else { return cached; }; }; Sprite_Light.prototype.getData = function(id) { return Khas.Lighting.LIGHTS[id]; }; Sprite_Light.prototype.getIntensity = function() { return this._intensity + Math.randomInt(this._variation); }; Sprite_Light.prototype.refreshLight = function() { if (this._id != this._character.light_id) { if (this._transition) { if (this._target_intensity == 0) { if (!(this._intensity <= 0)) return; } else { this._target_intensity = 0; this._transition = -this._transition; this._transition_up = false; this._dynamic_intensity = true; return; }; }; this.initializeLight(this._character.light_id); }; }; Sprite_Light.prototype.refreshScreenPosition = function() { if (this._syncWithDirection) { var d = this._character._direction; if (d != this._last_direction) { this._light.bitmap = this.getCachedBitmap(this._id, d); this._last_direction = d; this._last_crx = null; this._last_cry = null; }; this._screenX = this._character.lightScreenX() + this._ox[d]; this._screenY = this._character.lightScreenY() + this._oy[d]; } else { this._screenX = this._character.lightScreenX() + this._ox; this._screenY = this._character.lightScreenY() + this._oy; }; }; Sprite_Light.prototype.refreshOffsets = function() { this._character_ox = this._character.light_ox; this._character_oy = this._character.light_oy; this._ox = this._character_ox; this._oy = this._character_oy; if (this._syncWithDirection) this._ox = {2: this._ox, 4: this._ox, 6: this._ox, 8: this._ox }; if (this._syncWithDirection) this._oy = {2: this._oy, 4: this._oy, 6: this._oy, 8: this._oy }; this._last_crx = null; this._last_cry = null; }; Sprite_Light.prototype.refreshSize = function() { this._character_size = this._character.light_size; this.setSize(this._character_size); this._last_crx = null; this._last_cry = null; }; Sprite_Light.prototype.refreshTransition = function() { this._intensity += this._transition; if (this._transition_up && this._intensity >= this._target_intensity) { this._intensity = this._target_intensity ; this.alpha = this.getIntensity() * 0.01; this._dynamic_intensity = (this._variation > 0); }; }; Sprite_Light.prototype.refreshRenderingMode = function() { this._character_shadows = this._character.cast_shadows; this.setRendering(this._character_shadows); }; Sprite_Light.prototype.update = function() { this.refreshLight(); if (this.isValid()) { if (this._character_shadows != this._character.cast_shadows) this.refreshRenderingMode(); if (this._character_ox != this._character.light_ox ) this.refreshOffsets(); if (this._character_size != this._character.light_size) this.refreshSize(); if (this._intensity != this._target_intensity) this.refreshTransition(); this.refreshScreenPosition(); this.x = this._screenX; this.y = this._screenY; if (this._castShadows) this.refreshShadows(); if (this._dynamic_intensity) this.alpha = this.getIntensity() * 0.01; }; }; Sprite_Light.prototype.refreshHeight = function() { this._h = this._character.lightHeight(); }; Sprite_Light.prototype.refreshShadows = function() { if (this._character._realX == this._last_crx && this._character._realY == this._last_cry) return; var hw = this.scale.x * this._width * 0.5; var hh = this.scale.x * this._height * 0.5; if (this._screenX < -hw || this._screenY < -hh || this._screenX > Graphics.width + hw || this._screenY > Graphics.height + hh) return; this._last_crx = this._character._realX; this._last_cry = this._character._realY; this.refreshHeight(); var tw = $gameMap.tileWidth(); var th = $gameMap.tileHeight(); var cx = this._character._x; var cy = this._character._y; var x1 = Math.floor(cx - hw / tw); var x2 = Math.ceil(cx + hw / tw); var y1 = Math.floor(cy - hh / th); var y2 = Math.ceil(cy + hh / th); this._shadow.beginCasting(); for (var x = x1; x <= x2; x++) { for (var y = y1; y <= y2; y++) { var casters = $gameMap.getShadowCasters(x, y); if (casters) { for (var i = 0; i < casters.length; i++) { casters[i].cast(this); }; }; }; }; this._shadow.endCasting(); Graphics._renderer.render(this._light, this._renderedLight); }; Spriteset_Battle.prototype.kal_initializeKhasGraphics = Spriteset_Battle.prototype.initializeKhasGraphics; Spriteset_Battle.prototype.kal_update = Spriteset_Battle.prototype.update; Spriteset_Battle.prototype.initializeKhasGraphics = function() { this.createLightBattlers(); this.kal_initializeKhasGraphics(); }; Spriteset_Battle.prototype.createLightBattlers = function() { $gameMap.battleLighting.clearLightBattlers(); if (Khas.Lighting.Settings.AUTO_BATTLE_LIGHTING) { for (var i = 0; i < this._actorSprites.length; i++) { this.addLightBattler(this._actorSprites[i], "actor"); }; for (var i = 0; i < this._enemySprites.length; i++) { this.addLightBattler(this._enemySprites[i], "enemy"); }; }; }; Spriteset_Battle.prototype.addLightBattler = function(battlerSprite, type) { var lightBattler = new Game_LightBattler(battlerSprite, type); $gameMap.battleLighting.addLightBattler(lightBattler); }; Spriteset_Battle.prototype.update = function() { this.kal_update(); $gameMap.battleLighting.updateLightBattlers(); }; function Khas_AmbientLight() { this.initialize.apply(this, arguments); }; Object.defineProperty(Khas_AmbientLight.prototype, 'intensity', { get: function() { return this._intensity; }, }); Object.defineProperty(Khas_AmbientLight.prototype, 'red', { get: function() { return this._red; }, }); Object.defineProperty(Khas_AmbientLight.prototype, 'green', { get: function() { return this._green; }, }); Object.defineProperty(Khas_AmbientLight.prototype, 'blue', { get: function() { return this._blue; }, }); Khas_AmbientLight.prototype.initialize = function() { this.reset(); }; Khas_AmbientLight.prototype.reset = function() { this._intensity = 1.0; this._red = 1.0; this._green = 1.0; this._blue = 1.0; this._ti = this._intensity; this._tr = this._red; this._tg = this._green; this._tb = this._blue; this._di = 0.0; this._dr = 0.0; this._dg = 0.0; this._db = 0.0; this._timer = 0; }; Khas_AmbientLight.prototype.update = function() { if (this._timer > 0) { this.processChanges(); this._timer -= 1; if (!(this._timer > 0)) this.processTarget(); }; }; Khas_AmbientLight.prototype.set = function(i, time, r, g, b) { this._timer = (typeof time == "number" ? time : 0); this._ti = (typeof i == "number" ? i : this._intensity); this._tr = (typeof r == "number" ? r : this._red); this._tg = (typeof g == "number" ? g : this._green); this._tb = (typeof b == "number" ? b : this._blue); if (this._timer > 0) { this._di = (this._ti - this._intensity) / this._timer; this._dr = (this._tr - this._red) / this._timer; this._dg = (this._tg - this._green) / this._timer; this._db = (this._tb - this._blue) / this._timer; } else { this.processTarget(); }; }; Khas_AmbientLight.prototype.processChanges = function() { this._intensity += this._di; this._red += this._dr; this._green += this._dg; this._blue += this._db; }; Khas_AmbientLight.prototype.processTarget = function() { this._intensity = this._ti; this._red = this._tr; this._green = this._tg; this._blue = this._tb; }; Object.defineProperty(Khas_Graphics.prototype, 'lighting', { get: function() { return this._lighting; }, }); Khas_Graphics.prototype.kal_loadResources = Khas_Graphics.prototype.loadResources; Khas_Graphics.prototype.kal_newScene = Khas_Graphics.prototype.newScene; Khas_Graphics.prototype.kal_updateScene = Khas_Graphics.prototype.updateScene; Khas_Graphics.prototype.kal_clearScene = Khas_Graphics.prototype.clearScene; Khas_Graphics.prototype.loadResources = function() { this.kal_loadResources; var lightNames = Object.keys(Khas.Lighting.LIGHTS); for (var i = 0; i < lightNames.length; i++) { var light_data = Khas.Lighting.LIGHTS[lightNames[i]]; if (light_data.syncWithDirection) { Khas.Lighting.cache[lightNames[i]] = { 2: Khas.Lighting.cache[lightNames[i]] = ImageManager.loadLight("" + (light_data.fileName) + "_2"), 4: Khas.Lighting.cache[lightNames[i]] = ImageManager.loadLight("" + (light_data.fileName) + "_4"), 6: Khas.Lighting.cache[lightNames[i]] = ImageManager.loadLight("" + (light_data.fileName) + "_6"), 8: Khas.Lighting.cache[lightNames[i]] = ImageManager.loadLight("" + (light_data.fileName) + "_8") }; } else { Khas.Lighting.cache[lightNames[i]] = ImageManager.loadLight(light_data.fileName); }; }; Khas.Filters.LIGHTING = new Khas_LightingFilter(); }; Khas_Graphics.prototype.newScene = function() { this.kal_newScene(); switch (this._spriteset.khasType()) { case "map": $gameMap.battleLighting.clearLightBattlers(); this._lighting = new Khas_Lighting($gameMap.lighting); this._lighting.addMapLights(); break; case "battle": if (Khas.Lighting.Settings.AUTO_BATTLE_LIGHTING) $gameMap.battleLighting.copyAmbientLight($gameMap.lighting); this._lighting = new Khas_Lighting($gameMap.battleLighting); this._lighting.addLightPoints(); break; }; this._spriteset.addChild(this._lighting.layerSprite); }; Khas_Graphics.prototype.updateScene = function() { if (MapMovedLightFlame <= 0) { this.kal_updateScene(); if (this._lighting) this._lighting.update(); } else { MapMovedLightFlame--; } }; Khas_Graphics.prototype.clearScene = function() { this._lighting = null; this.kal_clearScene(); }; function Khas_Lighting() { this.initialize.apply(this, arguments); }; Object.defineProperty(Khas_Lighting.prototype, 'layerSprite', { get: function() { return this._layerSprite; }, }); Khas_Lighting.prototype.initialize = function(lightingState) { this._lights = []; this._events = []; this._player = false; this._lightingState = lightingState; this._enabled = this._lightingState.enabled; this._layer = new PIXI.Container(); this._lightMap = new PIXI.RenderTexture.create(Graphics.width, Graphics.height); this._filter = Khas.Filters.LIGHTING; this._filter.setResolution(Graphics.width, Graphics.height); this._filter.blendMode = PIXI.BLEND_MODES.KHAS_LIGHTING; this._layerSprite = new Khas_Sprite(this._lightMap); this._layerSprite.addFilter(this._filter); }; Khas_Lighting.prototype.update = function() { if (GrpSkipCount == 0 && ConfigManager.renderFpsHalf && Must60FPSFlame <= 0) { return; } if (this._enabled != this._lightingState.enabled) { this._enabled = this._lightingState.enabled; this._layerSprite.visible = this._enabled; }; if (!(this._enabled)) return; this._lightingState.update(); for (var i = 0; i < this._lights.length; i++) { this._lights[i].update(); if (this._lights[i].deleted()) { this.deleteLight(this._lights[i]); i -= 1; }; }; this._filter.setAmbientLight(this._lightingState.ambientLight); Graphics._renderer.render(this._layer, this._lightMap); }; Khas_Lighting.prototype.addLight = function(spriteLight) { this._lights.push(spriteLight); this._layer.addChild(spriteLight); }; Khas_Lighting.prototype.deleteLight = function(spriteLight) { switch (spriteLight.character.khasType()) { case "event": this._events.remove(spriteLight.character.eventId()); break; case "player": this._player = false; break; }; this._lights.remove(spriteLight); this._layer.removeChild(spriteLight); }; Khas_Lighting.prototype.addEvent = function(event) { var id = event.eventId(); if (!(this._events.include(id))) { this._events.push(id) ; this.addLight(new Sprite_Light(event)); }; }; Khas_Lighting.prototype.addPlayer = function() { if (!(this._player)) { this._player = true; this.addLight(new Sprite_Light($gamePlayer)); }; }; Khas_Lighting.prototype.addCharacter = function(character) { this.addLight(new Sprite_Light(character)); }; Khas_Lighting.prototype.addMapLights = function() { var events = $gameMap.events(); for (var i = 0; i < events.length; i++) { if (events[i].hasLight()) this.addEvent(events[i]); }; if ($gamePlayer.hasLight()) this.addPlayer(); var tiles = $gameMap.tileLights; for (var i = 0; i < tiles.length; i++) { this.addCharacter(tiles[i]); }; }; Khas_Lighting.prototype.addLightPoints = function() { var points = this._lightingState.lightPoints; for (var i = 0; i < points.length; i++) { this.addCharacter(points[i]); }; }; Khas.Filters.Source.FRAGMENT_LIGHTING = "\n varying vec2 vTextureCoord;\n\n uniform vec2 screenResolution;\n uniform sampler2D uSampler;\n uniform vec4 ambientLight;\n\n void main(void) {\n vec4 light = texture2D(uSampler, vTextureCoord);\n gl_FragColor = light + ambientLight;\n }\n"; function Khas_LightingFilter() { this.initialize.apply(this, arguments); }; Khas_LightingFilter.prototype = Object.create(Khas_Filter.prototype); Khas_LightingFilter.prototype.constructor = Khas_LightingFilter; Khas_LightingFilter.prototype.initialize = function() { Khas_Filter.prototype.initialize.call(this, Khas.Filters.Source.VERTEX_GENERAL, Khas.Filters.Source.FRAGMENT_LIGHTING); }; Khas_LightingFilter.prototype.setResolution = function(width, height) { this.uniforms.screenResolution.x = width; this.uniforms.screenResolution.y = height; }; Khas_LightingFilter.prototype.setLightMap = function(lightMap) { this.uniforms.lightMap = lightMap; }; Khas_LightingFilter.prototype.setAmbientLight = function(ambientLight) { this.uniforms.ambientLight[0] = ambientLight.red * ambientLight.intensity; this.uniforms.ambientLight[1] = ambientLight.green * ambientLight.intensity; this.uniforms.ambientLight[2] = ambientLight.blue * ambientLight.intensity; this.uniforms.ambientLight[3] = ambientLight.intensity; }; function Khas_Shadow() { this.initialize.apply(this, arguments); }; Object.defineProperty(Khas_Shadow.prototype, 'mask', { get: function() { return this._mask; }, }); Khas_Shadow.prototype.initialize = function(width, height) { this._mask = new PIXI.Graphics(); }; Khas_Shadow.prototype.resize = function(width, height) { this._width = width; this._height = height; this._hw = width / 2; this._hh = height / 2; }; Khas_Shadow.prototype.beginCasting = function() { this._mask.clear(); this._mask.beginFill(0x000000, 1.0); }; Khas_Shadow.prototype.endCasting = function() { this._mask.endFill(); }; Khas_Shadow.prototype.cast = function(x1, y1, x2, y2, scale) { x1 /= scale; x2 /= scale; y1 /= scale; y2 /= scale; var b1 = this.castRay(x1, y1); var b2 = this.castRay(x2, y2); this._mask.moveTo(x1, y1); this._mask.lineTo(b1[0], b1[1]); this._mask.lineTo(b2[0], b2[1]); this._mask.lineTo(x2, y2); this._mask.lineTo(x1, y1); }; Khas_Shadow.prototype.castClipped = function(x, y1, y2, scale) { x /= scale; y1 /= scale; y2 /= scale; var b1 = this.castRay(x, y1); var b2 = this.castRay(x, y2); this._mask.moveTo(x, y1); this._mask.lineTo(b1[0], b1[1]); if (b2[1] > y2) { this._mask.lineTo(b2[0], y2); } else { this._mask.lineTo(b2[0], b2[1]); }; this._mask.lineTo(x, y2); this._mask.lineTo(x, y1); }; Khas_Shadow.prototype.castRay = function(px, py) { var hw = this._hw; var hh = this._hh; var bx, by; if (px == 0) { bx = 0; by = (py < 0 ? -hh : hh); } else if (py == 0) { bx = (px < 0 ? -hw : hw); by = 0; } else { var m = py / px; var tx = (px < 0 ? -hw : hw); var ty = tx * m; if (Math.abs(ty) <= hh) { by = (py < 0 ? -hh : hh); bx = by / m; } else { bx = tx; by = ty; }; }; return [bx, by]; }; function Khas_ShadowCaster() { this.initialize.apply(this, arguments); }; Khas_ShadowCaster.prototype.initialize = function(x1, y1, x2, y2) { this._x1 = x1; this._y1 = y1; this._x2 = x2; this._y2 = y2; }; Khas_ShadowCaster.prototype.cast = function(light) { var sx1 = this.screenX(this._x1); var sx2 = this.screenX(this._x2); var sy1 = this.screenY(this._y1); var sy2 = this.screenY(this._y2); sx1 -= light.screenX; sx2 -= light.screenX; sy1 -= light.screenY; sy2 -= light.screenY; light.shadow.cast(sx1, sy1, sx2, sy2, light.scale.x); }; Khas_ShadowCaster.prototype.screenX = function(x) { return Math.round($gameMap.adjustX(x) * $gameMap.tileWidth() + $gameScreen.shake()); }; Khas_ShadowCaster.prototype.screenY = function(y) { return Math.round($gameMap.adjustY(y) * $gameMap.tileHeight()); }; function Khas_SCFT() { this.initialize.apply(this, arguments); }; Khas_SCFT.prototype.initialize = function(x, y, h) { this._x1 = x; this._x2 = x + 1; this._y = y; this._h = h; }; Khas_SCFT.prototype.cast = function(light) { var sx1 = this.screenX(this._x1); var sx2 = this.screenX(this._x2); var sy = this.screenY(this._y); sx1 -= light.screenX; sx2 -= light.screenX; sy -= light.screenY; if (sy > 0 || light.h >= this._h ) light.shadow.cast(sx1, sy, sx2, sy, light.scale.x); }; Khas_SCFT.prototype.screenX = function(x) { return Math.round($gameMap.adjustX(x) * $gameMap.tileWidth() + $gameScreen.shake()); }; Khas_SCFT.prototype.screenY = function(y) { return Math.round($gameMap.adjustY(y) * $gameMap.tileHeight()); }; function Khas_SCFB() { this.initialize.apply(this, arguments); }; Khas_SCFB.prototype.initialize = function(x, y, h) { this._x1 = x; this._x2 = x + 1; this._y = y + 1; this._h = h; }; Khas_SCFB.prototype.cast = function(light) { var sx1 = this.screenX(this._x1); var sx2 = this.screenX(this._x2); var sy = this.screenY(this._y); sx1 -= light.screenX; sx2 -= light.screenX; sy -= light.screenY; if (sy < 0 || light.h >= this._h ) light.shadow.cast(sx1, sy, sx2, sy, light.scale.x); }; Khas_SCFB.prototype.screenX = function(x) { return Math.round($gameMap.adjustX(x) * $gameMap.tileWidth() + $gameScreen.shake()); }; Khas_SCFB.prototype.screenY = function(y) { return Math.round($gameMap.adjustY(y) * $gameMap.tileHeight()); }; function Khas_SCFL() { this.initialize.apply(this, arguments); }; Khas_SCFL.prototype.initialize = function(x, y, h) { this._x = x; this._y1 = y; this._y2 = y + 1; this._h = h; }; Khas_SCFL.prototype.cast = function(light) { var sx = this.screenX(this._x); var sy1 = this.screenY(this._y1); var sy2 = this.screenY(this._y2); sx -= light.screenX; sy1 -= light.screenY; sy2 -= light.screenY; if (sx > 0 || light.h >= this._h ) light.shadow.cast(sx, sy1, sx, sy2, light.scale.x); }; Khas_SCFL.prototype.screenX = function(x) { return Math.round($gameMap.adjustX(x) * $gameMap.tileWidth() + $gameScreen.shake()); }; Khas_SCFL.prototype.screenY = function(y) { return Math.round($gameMap.adjustY(y) * $gameMap.tileHeight()); }; function Khas_SCFR() { this.initialize.apply(this, arguments); }; Khas_SCFR.prototype.initialize = function(x, y, h) { this._x = x + 1; this._y1 = y; this._y2 = y + 1; this._h = h; }; Khas_SCFR.prototype.cast = function(light) { var sx = this.screenX(this._x); var sy1 = this.screenY(this._y1); var sy2 = this.screenY(this._y2); sx -= light.screenX; sy1 -= light.screenY; sy2 -= light.screenY; if (sx < 0 || light.h >= this._h ) light.shadow.cast(sx, sy1, sx, sy2, light.scale.x); }; Khas_SCFR.prototype.screenX = function(x) { return Math.round($gameMap.adjustX(x) * $gameMap.tileWidth() + $gameScreen.shake()); }; Khas_SCFR.prototype.screenY = function(y) { return Math.round($gameMap.adjustY(y) * $gameMap.tileHeight()); }; function Khas_SCWL() { this.initialize.apply(this, arguments); }; Khas_SCWL.prototype.initialize = function(x, y1, y2) { this._x = x; this._y1 = y1; this._y2 = y2; }; Khas_SCWL.prototype.cast = function(light) { var sx = this.screenX(this._x); var sy1 = this.screenY(this._y1); var sy2 = this.screenY(this._y2); sx -= light.screenX; sy1 -= light.screenY; sy2 -= light.screenY; if (sx > 0 && sy2 > 0) light.shadow.cast(sx, sy1, sx, sy2, light.scale.x); if (sx < 0 && sy1 < 0) light.shadow.castClipped(sx, sy1, sy2, light.scale.x); }; Khas_SCWL.prototype.screenX = function(x) { return Math.round($gameMap.adjustX(x) * $gameMap.tileWidth() + $gameScreen.shake()); }; Khas_SCWL.prototype.screenY = function(y) { return Math.round($gameMap.adjustY(y) * $gameMap.tileHeight()); }; function Khas_SCWR() { this.initialize.apply(this, arguments); }; Khas_SCWR.prototype.initialize = function(x, y1, y2) { this._x = x + 1; this._y1 = y1; this._y2 = y2; }; Khas_SCWR.prototype.cast = function(light) { var sx = this.screenX(this._x); var sy1 = this.screenY(this._y1); var sy2 = this.screenY(this._y2); sx -= light.screenX; sy1 -= light.screenY; sy2 -= light.screenY; if (sx < 0 && sy2 > 0) light.shadow.cast(sx, sy1, sx, sy2, light.scale.x); if (sx > 0 && sy1 < 0) light.shadow.castClipped(sx, sy1, sy2, light.scale.x); }; Khas_SCWR.prototype.screenX = function(x) { return Math.round($gameMap.adjustX(x) * $gameMap.tileWidth() + $gameScreen.shake()); }; Khas_SCWR.prototype.screenY = function(y) { return Math.round($gameMap.adjustY(y) * $gameMap.tileHeight()); }; ShaderTilemap.prototype._drawShadow = function(layer, shadowBits, dx, dy) { };