Initial implementation

master
prestidigitator 2015-04-05 15:27:53 -07:00
parent a51bcce133
commit 2dc38aa466
28 changed files with 1402 additions and 0 deletions

522
PlayerState.lua Normal file
View File

@ -0,0 +1,522 @@
local exertion = select(1, ...);
local settings = exertion.settings;
local PLAYER_DB_FILE =
minetest.get_worldpath() .. "/" ..
exertion.MOD_NAME .. "_playerStatesDb.json";
local SECONDS_PER_DAY =
(function()
local ts = tonumber(minetest.setting_get("time_speed"));
if not ts or ts <= 0 then ts = 72; end;
return 24 * 60 * 60 / ts;
end)();
local DF_DT = settings.food_perDay / SECONDS_PER_DAY;
local DW_DT = settings.water_perDay / SECONDS_PER_DAY;
local DP_DT = settings.poison_perDay / SECONDS_PER_DAY;
local DHP_DT = settings.healing_perDay / SECONDS_PER_DAY;
local function clamp(x, min, max)
if x < min then
return min;
elseif x > max then
return max;
else
return x;
end;
end;
local gameToWallTime;
local wallToGameTime;
do
local ts = tonumber(minetest.setting_get("time_speed"));
if not ts or ts <= 0 then ts = 72; end;
local WALL_MINUS_GAME = os.time() - minetest.get_gametime();
gameToWallTime = function(tg)
return tg + WALL_MINUS_GAME;
end
wallToGameTime = function(tw)
return tw - WALL_MINUS_GAME;
end
end
local function calcMultiplier(mt,
exertionStatus,
fedStatus,
hydratedStatus,
poisonedStatus)
local em = mt.exertion[exertionStatus] or 1.0;
local fm = mt.fed[fedStatus] or 1.0;
local hm = mt.hydrated[hydratedStatus] or 1.0;
local pm = mt.poisoned[poisonedStatus] or 1.0;
return em * fm * hm * pm;
end;
local function canDrink(player)
local p = player:getpos();
local hn = minetest.get_node({ x = p.x, y = p.y + 1, z = p.z });
if not hn or hn.name ~= "air" then return false; end;
return minetest.find_node_near(p, settings.drinkDistance, "group_water");
end;
--- Manages player state for the exertion mod.
--
-- @author presitidigitator (as reistered at forum.minetest.net).
-- @copyright 2015, licensed under WTFPL
--
local PlayerState = { db = {} };
local PlayerState_meta = {};
local PlayerState_ops = {};
local PlayerState_inst_meta = {};
setmetatable(PlayerState, PlayerState_meta);
PlayerState_inst_meta.__index = PlayerState_ops;
--- Constructs a PlayerState, loading from the database if present there, or
-- initializing to an initial state otherwise.
--
-- Call with one of:
-- PlayerState.new(player)
-- PlayerState(player)
--
-- @return a new PlayerState object
--
function PlayerState.new(player)
local playerName = player:get_player_name();
if not playerName or playerName == "" then
error("Argument is not a player");
end;
local state = PlayerState.db[playerName];
local newState = false;
if not state then
state = {};
PlayerState.db[playerName] = state;
newState = true;
end;
local self =
setmetatable({ player = player, state = state; }, PlayerState_inst_meta);
self:initialize(newState);
return self;
end;
PlayerState_meta.__call =
function(class, ...) return PlayerState.new(...); end;
--- Loads the PlayerState DB from the world directory (call only when the mod
-- is first loaded).
function PlayerState.load()
local playerDbFile = io.open(PLAYER_DB_FILE, 'r');
if playerDbFile then
local ps = minetest.parse_json(playerDbFile:read('*a'));
if ps then PlayerState.db = ps; end;
playerDbFile:close();
end;
end;
function PlayerState.save()
local playerDbFile = io.open(PLAYER_DB_FILE, 'w');
if playerDbFile then
local json, err = minetest.write_json(PlayerState.db);
if not json then playerDbFile:close(); error(err); end;
playerDbFile:write(json);
playerDbFile:close();
end;
end;
function PlayerState_ops:initialize(newState)
local tw = os.time();
local tg = minetest.get_gametime();
if newState then
self.state.fed = settings.fedMaximum;
self.state.hydrated = settings.hydratedMaximum;
self.state.poisoned = 0;
self.state.foodLost = 0;
self.state.waterLost = 0;
self.state.poisonLost = 0;
self.state.hpGained = 0;
self.state.airLost = 0;
self.state.updateGameTime = tg;
self.state.updateWallTime = tw;
self.activity = 0;
self.activityPolls = 0;
self.builds = 0;
self:updatePhysics();
self:updateHud();
else
local dt;
if settings.useWallclock and
self.state.updateWallTime and
self.state.updateWallTime <= tw
then
dt = tw - self.state.updateWallTime;
elseif self.state.updateGameTime and
self.state.updateGameTime <= tg
then
dt = tg - self.state.updateGameTime;
else
dt = 0;
end;
self.state.fed = self.state.fed or 0;
self.state.hydrated = self.state.hydrated or 0;
self.state.poisoned = self.state.poisoned or 0;
self.state.foodLost = self.state.foodLost or 0;
self.state.waterLost = self.state.waterLost or 0;
self.state.poisonLost = self.state.poisonLost or 0;
self.state.hpGained = self.state.hpGained or 0;
self.state.airLost = 0;
self.activity = 0;
self.activityPolls = 0;
self.builds = 0;
self:update(tw, dt);
end;
end;
function PlayerState_ops:calcExertionStatus()
local polls = self.activityPolls;
local ar = (polls > 0 and self.activity / polls) or 0;
local b = self.builds;
local status = nil;
local priority = nil;
for s, c in pairs(settings.exertionStatuses) do
if c then
local pc = c.priority;
if not priority or (pc and pc > priority) then
local arc = c.activityRatio;
local bc = c.builds;
if (arc and ar >= arc) or (bc and b >= bc)
then
status = s;
priority = pc;
end;
end;
end;
end;
return status or 'none';
end;
function PlayerState_ops:calcFedStatus()
local fed = self.state.fed;
local status = nil;
local threshold = nil;
for s, t in pairs(settings.fedStatuses) do
if t > threshold and fed >= t then
status = s;
threshold = t;
end;
end;
return status or 'none';
end;
function PlayerState_ops:calcHydratedStatus()
local hyd = self.state.hydrated;
local status = nil;
local threshold = nil;
for s, t in pairs(settings.hydratedStatuses) do
if t > threshold and hyd >= t then
status = s;
threshold = t;
end;
end;
return status or 'none';
end;
function PlayerState_ops:calcPoisonedStatus()
local poi = self.state.poisoned;
local status = nil;
local threshold = nil;
for s, t in pairs(settings.poisonedStatuses) do
if t > threshold and poi >= t then
status = s;
threshold = t;
end;
end;
return status or 'none';
end;
function PlayerState_ops:addFood(df)
local fedChanged = false;
if df > 0 then
if df >= 1.0 then
local dfn, dff = math.modf(df);
self.state.fed = clamp(self.state.fed + dfn, 0, settings.fedMaximum);
if self.state.foodLost < 0 then
self.state.foodLost = self.state.foodLost - dff;
else
self.state.foodLost = -dff;
end;
fedChanged = true;
else
self.state.foodLost = self.state.foodLost - df;
end;
elseif df < 0 then
df = self.state.foodLost - df; -- now positive
if df >= 1.0 then
local dfn, dff = math.modf(df);
self.state.fed = clamp(self.state.fed - dfn, 0, setttings.fedMaximum);
self.state.foodLost = dff;
fedChanged = true;
else
self.state.foodLost = df;
end;
end;
return fedChanged;
end;
function PlayerState_ops:addWater(dw)
local hydratedChanged = false;
if dw > 0 then
if dw >= 1.0 then
local dwn, dwf = math.modf(dw);
self.state.hydrated =
clamp(self.state.hydrated + dwn, 0, settings.hydratedMaximum);
if self.state.waterLost < 0 then
self.state.waterLost = self.state.waterLost - dwf;
else
self.state.waterLost = -dwf;
end;
hydratedChanged = true;
else
self.state.waterLost = self.state.waterLost - dw;
end;
elseif dw < 0 then
dw = self.state.waterLost - dw; -- now positive
if dw >= 1.0 then
local dwn, dwf = math.modf(dw);
self.state.hydrated =
clamp(self.state.hydrated - dwn, 0, setttings.hydratedMaximum);
self.state.waterLost = dwf;
hydratedChanged = true;
else
self.state.waterLost = dw;
end;
end;
return hydratedChanged;
end;
function PlayerState_ops:addPoison(dp)
local poisonedChanged = false;
if dp > 0 then
local dpn = math.ceil(dp);
local dpf = dpn - dp;
self.state.poisoned =
clamp(self.state.poisoned + dpn, 0, settings.poisonedMaximum);
self.state.poisonLost = 0;
poisonedChanged = true;
elseif dp < 0 then
dp = self.state.poisonLost - dp; -- now positive
if dp >= 1.0 then
local dpn, dpf = math.modf(dp);
self.state.poisoned =
clamp(self.state.poisoned - dpn, 0, setttings.poisonMaximum);
self.state.poisonLost = dpf;
poisonedChanged = true;
else
self.state.poisonLost = dp;
end;
end;
return poisonedChanged;
end;
function PlayerState_ops:addHp(dhp)
local hpChanged = false;
dhp = self.state.hpGained + dhp;
if dhp < 0 or dhp >= 1.0 then
local dhpf = dhp % 1.0;
local dhpn = dhp - dhpf;
self.player:set_hp(self.player:get_hp() + dhpn);
self.state.hpGained = dhpf;
hpChanged = true;
else
self.state.hpGained = dhp;
end;
return hpChanged;
end;
function PlayerState_ops:addBreath(db)
local player = self.player;
local b0 = player:get_breath();
local breathChanged = false;
if b0 < 11 then
if db > 0 then
if db > 1.0 then
local dbn, dbf = math.modf(db);
player:set_breath(b0 + dbn);
self.state.airLost = -dbf;
breathChanged = true;
else
self.state.airLost = self.state.airLost - db;
end;
elseif db < 0 then
db = self.state.airLost - db; -- now positive
if db > 1.0 then
local dbn, dbf = math.modf(db);
player:set_breath(b0 - dbn);
self.state.airLost = dbf;
breathChanged = true;
else
self.state.airLost = db;
end;
end;
else
self.state.airLost = 0;
end;
return breathChanged;
end;
function PlayerState_ops:update(tw, dt)
local player = self.player;
if tw == nil then tw = os.time(); end;
if dt == nil then dt = tw - self.state.updateWallTime; end;
if dt < 0 then return; end;
local hudChanged = false;
local es = self:calcExertionStatus();
local fs = self:calcFedStatus();
local hs = self:calcHydratedStatus();
local ps = self:calcPoisonedStatus();
local retchProb = poisonedRetchProbabilities_perPeriod[ps];
local retching = retchProb and math.random() <= retchProb;
if self.state.fed > 0 then
local fm = calcMultiplier(settings.foodMultipliers, es, fs, hs, ps);
local df = -DF_DT * fm * dt;
if retching then df = df - settings.retchingFoodLoss; end;
hudChanged = self:addFood(df) or hudChanged;
end;
if canDrink(player) then
hudChanged = self:addWater(setting.drinkAmount_perPeriod) or hudChanged;
elseif self.state.hydrated > 0 then
local wm = calcMultiplier(settings.waterMultipliers, es, fs, hs, ps);
local dw = -DW_DT * wm * dt;
if retching then dw = dw - settings.retchingWaterLoss; end;
hudChanged = self:addWater(dw) or hudChanged;
end;
if self.state.poisoned > 0 then
local dp = -DP_DT * dt;
hudChanged = self:addPoison(dp) or hudChanged;
end;
local hpm = calcMultiplier(settings.healingMultipliers, es, fs, hs, ps);
local dhp = DHP_DT * hpm * dt;
if retching then dhp = dhp - settings.retchingDamage; end;
self:addHp(dhp);
self:addBreath((retching and -settings.retchingAirLoss) or 0);
if retching then
player:set_physics_override({ speed = 0, jump = 0 });
minetest.after(settings.retchDuration_seconds,
self.updatePhysics, self, es, fs, hs, ps);
else
self:updatePhysics(es, fs, hs, ps);
end;
if hudChanged then self:updateHud(); end;
self.activity = 0;
self.activityPolls = 0;
self.builds = 0;
self.state.updateGameTime = wallToGameTime(tg);
self.state.updateWallTime = tw;
end;
function PlayerState_ops:updatePhysics(es, fs, hs, ps)
if not es then es = self:calcExertionStatus(); end;
if not fs then fs = self:calcFedStatus(); end;
if not hs then hs = self:calcHydratedStatus(); end;
if not ps then ps = self:calcPoisonedStatus(); end;
local sm = calcMultiplier(settings.speedMultipliers, es, fs, hs, ps);
local jm = calcMultiplier(settings.jumpMultipliers, es, fs, hs, ps);
self.player:set_physics_override({ speed = sm, jump = jm });
end;
function PlayerState_ops:updateHud()
local player = self.player;
local fh = self.fedHudId;
if not fh then
fh = player:hud_add(settings.fedHud);
self.fedHudId = fh;
end;
player:hud_change(fh, 'number', self.state.fed);
local hh = self.hydratedHudId;
if not fh then
hh = player:hud_add(settings.hydratedHud);
self.hydratedHudId = hh;
end;
player:hud_change(hh, 'number', self.state.hydrated);
local ph = self.poisonedHudId;
if not fh then
ph = player:hud_add(settings.poisonedHud);
self.poisonedHudId = ph;
end;
player:hud_change(ph, 'number', self.state.poisoned);
end;
function PlayerState_ops:pollForActivity()
local player = self.player;
self.activityPolls = self.activityPolls + 1;
local activeControls = player:get_player_control();
local testControls = settings.exertionControls;
for _, ctrl in ipairs(testControls) do
if activeControls[ctrl] then
self.activity = self.activity + 1;
return;
end;
end;
if player:get_breath() <= settings.exertionHoldingBreathMax then
self.activity = self.activity + 1;
return;
end;
end;
function PlayerState_ops:markBuildAction(node)
local nodeName = node.name;
if not (minetest.get_node_group(nodeName, "oddly_breakable_by_hand") > 0 or
minetest.get_node_group(nodeName, "dig_immediate") > 0)
then
self.builds = self.builds + 1;
end;
end;
return PlayerState;

1
depends.txt Normal file
View File

@ -0,0 +1 @@
default

99
init.lua Normal file
View File

@ -0,0 +1,99 @@
local MOD_NAME = minetest.get_current_modname() or "exertion";
local MOD_PATH = minetest.get_modpath();
local exertion = { MOD_NAME = MOD_NAME, MOD_PATH = MOD_PATH };
_G[MOD_NAME] = exertion;
local function callFile(fileName, ...)
local chunk, err = loadfile(MOD_PATH .. "/" .. fileName);
if not chunk then error(err); end;
return chunk(...);
end;
local settings = callFile("loadSettings.lua", exertion);
exertion.settings = settings;
local PlayerState = callFile("PlayerState.lua", exertion);
exertion.PlayerState = PlayerState;
PlayerState.load();
local playerStates = {};
minetest.register_on_joinplayer(
function(player)
minetest.after(
0, function() playerStates[player] = PlayerState(player); end);
end);
minetest.register_on_leaveplayer(
function(player)
playerStates[player] = nil;
end);
minetest.register_on_shutdown(PlayerState.save);
minetest.register_on_dignode(
function(pos, oldNode, digger)
local ps = playerStates[digger];
if ps then ps:markBuildAction(oldNode); end;
end);
minetest.register_on_placenode(
function(pos, newNode, placer, oldNode, itemStack, pointedThing)
local ps = playerStates[placer];
if ps then ps:markBuildAction(newNode); end;
end);
local controlPeriod = settings.controlTestPeriod_seconds;
local updatePeriod = settings.accountingPeriod_seconds;
local savePeriod = settings.savePeriod_seconds;
local controlTime = 0.0;
local updateTime = 0.0;
local saveTime = 0.0;
minetest.register_globalstep(
function(dt)
controlTime = controlTime + dt;
if controlTime >= controlPeriod then
for _, ps in pairs(playerStates) do
ps:pollForActivity();
end;
controlTime = 0;
end;
updateTime = updateTime + dt;
if updateTime >= updatePeriod then
controlPeriod = settings.controlTestPeriod_seconds;
updatePeriod = settings.accountingPeriod_seconds;
local tw = os.time();
for _, ps in pairs(playerStates) do
ps:update(tw, updateTime);
end;
updateTime = 0;
end;
saveTime = saveTime + dt;
if saveTime >= savePeriod then
savePeriod = settings.savePeriod_seconds;
PlayerState.save();
saveTime = 0;
end;
end);
minetest.register_on_item_eat(
function(hpChange, replacementItem, itemStack, player, pointedThing)
if itemStack:take_item() ~= nil then
local ps = playerStates[player];
if ps then
if hpChange > 0 then
ps:addFood(hpChange);
elseif hpChange < 0 then
ps:addPoison(-hpChange);
end;
end;
itemStack:add_item(replacementItem);
end;
return itemStack;
end);

51
loadSettings.lua Normal file
View File

@ -0,0 +1,51 @@
local exertion = select(1, ...) or exertion;
local MOD_SETTINGS_FILE =
exertion.MOD_PATH .. "/settings.lua";
local WORLD_SETTINGS_FILE =
minetest.get_worldpath() .. "/" .. exertion.MOD_NAME .. "_settings.lua";
local settings = {};
local function loadSettingsFile(filePath)
-- test for existence/readability
local file = io.open(filePath, 'r');
if not file then return nil; end;
file:close();
local chunk, err = loadfile(filePath);
return chunk or error(err);
end;
local modSettingsFunc = loadSettingsFile(MOD_SETTINGS_FILE);
local worldSettingsFunc = loadSettingsFile(WORLD_SETTINGS_FILE);
if not modSettingsFunc and not worldSettingsFunc then return settings; end;
-- Setting any "global" variable in the settings files actually modifies the
-- settings table (unless the variable is accessed through another existing
-- table like _G).
local settingsEnv =
setmetatable(
{},
{
__index = function(self, key)
local v = settings[key];
if v ~= nil then return v; else return _G[key]; end;
end,
__newindex = function(self, key, value)
settings[key] = value;
return true;
end,
});
if modSettingsFunc then
setfenv(modSettingsFunc, settingsEnv);
modSettingsFunc();
end;
if worldSettingsFunc then
setfenv(worldSettingsFunc, settingsEnv);
worldSettingsFunc();
end;
return settings;

414
settings.lua Normal file
View File

@ -0,0 +1,414 @@
--- Basic Definitions
-- Food points (half-icons) for the the maximum, fully fed bar.
--
-- default: fedMaximum = 20;
--
fedMaximum = 20;
-- Water points (half-icons) for the the maximum, fully hydrated bar.
--
-- default: hydratedMaximum = 20;
--
hydratedMaximum = 20;
-- Poison points (half-icons) for the maximum poisoned amount.
--
-- default: poisonMaximum = 4;
--
poisonMaximum = 4;
--- Rates and Times
-- Whether to use wallclock time, so fed and hydrated amounts go down not just
-- when logged off, but when the server isn't running (falls back to game time
-- if server's time has been set backwards enough to "go back in time"). Note
-- that poison is NOT modified while logged out, though it also doesn't cause
-- damage, etc.
--
-- default: useWallclock = true;
--
useWallclock = true;
-- Base amount of food that needs to be consumed each day to stay fed, in both
-- points (half-icons) and conventional food "HP gain".
--
-- default: food_perDay = 4;
--
food_perDay = 4;
-- Base amount of water (hydration) lost each day, in points (half-icons).
--
-- default: water_perDay = 8;
--
water_perDay = 8;
-- Amount poison decreases each day, in points (half-icons).
--
-- default: poison_perDay = 4;
--
poison_perDay = 4;
-- Amount HP (half-icons) healed per day if properly fed, hydrated, and not
-- poisoned.
--
-- default: healing_perDay = 4;
--
healing_perDay = 4;
-- Distance water must be from player while player's head is in air to drink.
--
-- default: drinkingDistance = 1.5;
--
drinkDistance = 1;
-- Amount of water to drink in points (half-icons) each period when able.
--
-- default: drinkAmount_perPeriod = 4.0;
--
drinkAmount_perPeriod = 4.0;
-- Period between tests of user controls for testing movement exertion.
-- Decrease if not responsive enough; increase if its creating too much server
-- lag.
--
-- default: controlTestPeriod_seconds = 0.1;
--
controlTestPeriod_seconds = 0.1;
-- Length of an accounting period.
--
-- default: accountingPeriod_seconds = 30.0;
--
accountingPeriod_seconds = 30.0;
-- Amount of time spent retching (can't walk or jump).
--
-- default: retchDuration_seconds = 2.0;
--
retchDuration_seconds = 2.0;
-- Time between saves.
--
-- default: savePeriod_seconds = 300.0;
--
savePeriod_seconds = 300.0;
--- Enumerated Statuses
-- Status values indicating how hard the player is exerting him-/herself. Each
-- key is a status value. Each value is a condition object indicating when
-- the player has that status. Each condition object has the following fields:
-- * priority - The status that is used is the one with the highest priority
-- and any of its condition(s) met.
-- * activityRatio - The minimum ratio of strenuous movement/breath
-- activities noted to total number of times activity is polled in an
-- accounting period to meet the status condition.
-- * builds - The minimum number of digs or node placements that must occur
-- during an accounting period to meet the status condition. Nodes
-- with the 'dig_immediate' and/or 'oddly_breakable_by_hand' groups are
-- not counted.
-- If no status conditions are met, the special status 'none' is used.
--
-- defaults:
-- exertionStatuses = exertionStatuses or {};
-- exertionStatuses.light =
-- { priority = 1, activityRatio = 0.25, builds = 10 };
-- exertionStatuses.heavy =
-- { priority = 2, activityRatio = 0.75, builds = 20 };
--
exertionStatuses = exertionStatuses or {};
exertionStatuses.light =
{ priority = 1, activityRatio = 0.25, builds = 10 };
exertionStatuses.heavy =
{ priority = 2, activityRatio = 0.75, builds = 20 };
-- Status values indicating how well fed the player is. Each key is a status.
-- Each value is a threshold for the minimum fed points (half-icons) for that
-- status. The highest threshold has precedence. Behavior is undefined if the
-- same threshold is used for multiple status keys. The special status 'none'
-- is used when no others apply.
--
-- defaults:
-- fedStatuses = fedStatuses or {};
-- fedStatuses.starving = 0;
-- fedStatuses.hungry = 1;
-- fedStatuses.full = 10;
--
fedStatuses = fedStatuses or {};
fedStatuses.starving = 0;
fedStatuses.hungry = 1;
fedStatuses.full = 10;
-- Status values indicating how well hydrated the player is. Each key is a
-- status. Each value is a threshold for the minimum hydrated points
-- (half-icons) for that status. The highest threshold has precedence.
-- Behavior is undefined if the same threshold is used for multiple status
-- keys. The special status 'none' is used when no others apply.
--
-- defaults:
-- hydratedStatuses = hydratedStatuses or {};
-- hydratedStatuses.dehydrated = 0;
-- hydratedStatuses.thirsty = 1;
-- hydratedStatuses.hydrated = 10;
--
hydratedStatuses = hydratedStatuses or {};
hydratedStatuses.dehydrated = 0;
hydratedStatuses.thirsty = 1;
hydratedStatuses.hydrated = 10;
-- Status values indicating how badly poisoned the player is. Each key is a
-- status. Each value is a threshold for the minimum hydrated points
-- (half-icons) for that status. The highest threshold has precedence.
-- Behavior is undefined if the same threshold is used for multiple status
-- keys. The special status 'none' is used when no others apply.
--
-- defaults:
-- poisonedStatuses = poisonedStatuses or {};
-- poisonedStatuses.poisoned = 1;
--
poisonedStatuses = poisonedStatuses or {};
poisonedStatuses.poisoned = 1;
--- Exertion Status Conditions
-- Control keys (from Player:get_player_control()) that indicates the player is
-- engaging in strenuous movement. Any time these controls are detected
-- (and/or the player is holding his/her breath), it contributes to the
-- activity ratio.
--
-- default: exertionControls = { 'up', 'down', 'left', 'right', 'jump' };
--
exertionControls = { 'up', 'down', 'left', 'right', 'jump' };
-- Breath (from Player:get_breath()) max (inclusive) threshold that indicates
-- the player is straining to hold his/her breath. Any time the player's
-- breath is less than or equal to this (or the player is moving), it
-- contributes to the activity ratio.
--
-- default: exertionBreathMax = 10;
--
exertionHoldingBreathMax = 10;
--- Status Effects
-- Rate multipliers for amount of food decrease per period for each status
-- (exertion, fed, hydrated, poisoned). Each multiplier defaults to 1.0 if the
-- applicable status is not present.
--
-- defaults:
-- foodMultipliers = foodMultipliers or
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
-- foodMultipliers.exertion.none = 1.0;
-- foodMultipliers.exertion.light = 2.0;
-- foodMultipliers.exertion.heavy = 3.0;
--
foodMultipliers = foodMultipliers or
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
foodMultipliers.exertion.none = 1.0;
foodMultipliers.exertion.light = 2.0;
foodMultipliers.exertion.heavy = 3.0;
-- Rate multipliers for amount of food decrease per period for each status
-- (exertion, fed, hydrated, poisoned). Each multiplier defaults to 1.0 if the
-- applicable status is not present.
--
-- defaults:
-- waterMultipliers = waterMultipliers or
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
-- waterMultipliers.exertion.none = 1.0;
-- waterMultipliers.exertion.light = 2.0;
-- waterMultipliers.exertion.heavy = 3.0;
--
waterMultipliers = waterMultipliers or
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
waterMultipliers.exertion.none = 1.0;
waterMultipliers.exertion.light = 2.0;
waterMultipliers.exertion.heavy = 3.0;
-- Rate multipliers for healing per period for each status (exertion, fed,
-- hydrated, poisoned). Each multiplier defaults to 1.0 if the applicable
-- status is not present.
--
-- defaults:
-- healingMultipliers = healingMultipliers or
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
-- healingMultipliers.exertion.none = 1.0;
-- healingMultipliers.exertion.light = 1.0;
-- healingMultipliers.exertion.heavy = 0.5;
-- healingMultipliers.fed.starving = 0.0;
-- healingMultipliers.fed.hungry = 0.0;
-- healingMultipliers.fed.full = 1.0;
-- healingMultipliers.hydrated.dehydrated = 0.0;
-- healingMultipliers.hydrated.thirsty = 0.0;
-- healingMultipliers.hydrated.hydrated = 1.0;
-- healingMultipliers.poisoned.none = 1.0;
-- healingMultipliers.poisoned.poisoned = 0.0;
--
healingMultipliers = healingMultipliers or
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
healingMultipliers.exertion.none = 1.0;
healingMultipliers.exertion.light = 1.0;
healingMultipliers.exertion.heavy = 0.5;
healingMultipliers.fed.starving = 0.0;
healingMultipliers.fed.hungry = 0.0;
healingMultipliers.fed.full = 1.0;
healingMultipliers.hydrated.dehydrated = 0.0;
healingMultipliers.hydrated.thirsty = 0.0;
healingMultipliers.hydrated.hydrated = 1.0;
healingMultipliers.poisoned.none = 1.0;
healingMultipliers.poisoned.poisoned = 0.0;
-- Multipliers for running speed per period for each status (exertion, fed,
-- hydrated, poisoned). Each multiplier defaults to 1.0 if the applicable
-- status is not present.
--
-- defaults:
-- speedMultipliers = speedMultipliers or
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
-- speedMultipliers.fed.starving = 0.8;
-- speedMultipliers.fed.hungry = 1.0;
-- speedMultipliers.fed.full = 1.0;
-- speedMultipliers.hydrated.dehydrated = 0.8;
-- speedMultipliers.hydrated.thirsty = 1.0;
-- speedMultipliers.hydrated.hydrated = 1.0;
-- speedMultipliers.poisoned.none = 1.0;
-- speedMultipliers.poisoned.poisoned = 0.8;
--
speedMultipliers = speedMultipliers or
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
speedMultipliers.fed.starving = 0.8;
speedMultipliers.fed.hungry = 1.0;
speedMultipliers.fed.full = 1.0;
speedMultipliers.hydrated.dehydrated = 0.8;
speedMultipliers.hydrated.thirsty = 1.0;
speedMultipliers.hydrated.hydrated = 1.0;
speedMultipliers.poisoned.none = 1.0;
speedMultipliers.poisoned.poisoned = 0.8;
-- Multipliers for jumping per period for each status (exertion, fed, hydrated,
-- poisoned). Each multiplier defaults to 1.0 if the applicable status is not
-- present.
--
-- defaults:
-- jumpMultipliers = jumpMultipliers or
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
-- jumpMultipliers.fed.starving = 0.8;
-- jumpMultipliers.fed.hungry = 1.0;
-- jumpMultipliers.fed.full = 1.0;
-- jumpMultipliers.hydrated.dehydrated = 0.8;
-- jumpMultipliers.hydrated.thirsty = 1.0;
-- jumpMultipliers.hydrated.hydrated = 1.0;
-- jumpMultipliers.poisoned.none = 1.0;
-- jumpMultipliers.poisoned.poisoned = 0.8;
--
jumpMultipliers = jumpMultipliers or
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
jumpMultipliers.fed.starving = 0.8;
jumpMultipliers.fed.hungry = 1.0;
jumpMultipliers.fed.full = 1.0;
jumpMultipliers.hydrated.dehydrated = 0.8;
jumpMultipliers.hydrated.thirsty = 1.0;
jumpMultipliers.hydrated.hydrated = 1.0;
jumpMultipliers.poisoned.none = 1.0;
jumpMultipliers.poisoned.poisoned = 0.8;
-- Probabilities of retching each accounting period for each poisoned status.
--
-- default:
-- poisonedRetchProbabilities_perPeriod =
-- poisonedRetchProbabilities_perPeriod or {};
-- poisonedRetchProbabilities_perPeriod.none = 0.0;
-- poisonedRetchProbabilities_perPeriod.poisoned = 0.25;
--
poisonedRetchProbabilities_perPeriod =
poisonedRetchProbabilities_perPeriod or {};
poisonedRetchProbabilities_perPeriod.none = 0.0;
poisonedRetchProbabilities_perPeriod.poisoned = 0.25;
-- Amount of food loss when retching, in points (half-icons).
-- default: retchingFoodLoss = 2.0;
retchingFoodLoss = 2.0;
-- Amount of food loss when retching, in points (half-icons).
-- default: retchingWaterLoss = 4.0;
retchingWaterLoss = 4.0;
-- Damage taken when retching, in HP (half-icons).
-- default: retchingDamage = 0.1;
retchingDamage = 0.1;
-- Amount of air lost when holding breath and retching, in bubbles
-- (half-icons).
-- default: retchingAirLoss = 10.0;
retchingAirLoss = 10.0;
--- User Interface
-- Fed HUD bar definition.
--
-- default:
-- fedHud = fedHud or { number = 0 };
-- fedHud.hud_elem_type = 'statbar';
-- fedHud.position = { x = 0.0, y = 1.0 };
-- fedHud.text = "exertion_toastIcon_24x24.png";
-- fedHud.direction = 3;
-- fedHud.size = { x = 24, y = 24 };
-- fedHud.offset = { x = 2, y = -26 };
--
fedHud = fedHud or { number = 0 };
fedHud.hud_elem_type = 'statbar';
fedHud.position = { x = 0.0, y = 1.0 };
fedHud.text = "exertion_toastIcon_24x24.png";
fedHud.direction = 3;
fedHud.size = { x = 24, y = 24 };
fedHud.offset = { x = 2, y = -26 };
-- Hydrated HUD bar definition.
--
-- default:
-- hydratedHud = hydratedHud or { number = 0 };
-- hydratedHud.hud_elem_type = 'statbar';
-- hydratedHud.position = { x = 0.0, y = 1.0 };
-- hydratedHud.text = "exertion_waterIcon_24x24.png";
-- hydratedHud.direction = 3;
-- hydratedHud.size = { x = 24, y = 24 };
-- hydratedHud.offset = { x = 28, y = -26 };
--
hydratedHud = hydratedHud or { number = 0 };
hydratedHud.hud_elem_type = 'statbar';
hydratedHud.position = { x = 0.0, y = 1.0 };
hydratedHud.text = "exertion_waterIcon_24x24.png";
hydratedHud.direction = 3;
hydratedHud.size = { x = 24, y = 24 };
hydratedHud.offset = { x = 28, y = -26 };
-- Poisoned HUD bar definition.
--
-- default:
-- poisonedHud = poisonedHud or { number = 0 };
-- poisonedHud.hud_elem_type = 'statbar';
-- poisonedHud.position = { x = 0.0, y = 1.0 };
-- poisonedHud.text = "exertion_spiderIcon_24x24.png";
-- poisonedHud.direction = 3;
-- poisonedHud.size = { x = 24, y = 24 };
-- poisonedHud.offset = { x = 54, y = -26 };
--
poisonedHud = poisonedHud or { number = 0 };
poisonedHud.hud_elem_type = 'statbar';
poisonedHud.position = { x = 0.0, y = 1.0 };
poisonedHud.text = "exertion_spiderIcon_24x24.png";
poisonedHud.direction = 3;
poisonedHud.size = { x = 24, y = 24 };
poisonedHud.offset = { x = 54, y = -26 };
-- Sound played when retching.
--
-- default: retchingSound = "exertion_doubleRetching.ogg";
--
retchingSound = "exertion_doubleRetching.ogg";

Binary file not shown.

Binary file not shown.

112
sourceImages/spiderIcon.svg Normal file
View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 16 16"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="spiderIcon.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="50.75"
inkscape:cx="8"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:snap-global="false"
inkscape:window-width="1920"
inkscape:window-height="990"
inkscape:window-x="-2"
inkscape:window-y="32"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid4136"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 2.5292969 -0.005859375 C 1.4361524 -0.028859375 0.66187592 1.2148469 1.1660156 2.1855469 L 1.6015625 3.0566406 C 1.5374345 3.0466406 1.4865731 2.981375 1.4238281 2.984375 C 1.0167522 3.005375 0.67953852 3.1837406 0.43164062 3.4316406 C 0.18374275 3.6795406 0.00497071 4.0167281 -0.015625 4.4238281 C -0.03622071 4.8308281 0.15035899 5.2841719 0.45507812 5.5761719 L 2.6894531 7.8125 L 3.2558594 8.0019531 L 2.9257812 8.1113281 L 0.86914062 9.1386719 C 0.47911968 9.3127719 0.14786525 9.6844312 0.033203125 10.082031 C -0.081458985 10.479531 -0.018974425 10.861034 0.13867188 11.177734 C 0.29631817 11.494334 0.56291554 11.773775 0.94921875 11.921875 C 1.3222927 12.064975 1.7930685 12.015172 2.1621094 11.826172 L 1.1601562 13.826172 C 0.9713537 14.199072 0.94486792 14.678434 1.09375 15.052734 C 1.2426319 15.426934 1.516822 15.690103 1.828125 15.845703 C 2.139428 16.001403 2.5136042 16.062531 2.9023438 15.957031 C 3.2910831 15.851531 3.658767 15.542769 3.84375 15.167969 L 4.4804688 13.892578 A 4 4 0 0 0 8 16 A 4 4 0 0 0 11.521484 13.894531 L 12.15625 15.167969 C 12.34127 15.542669 12.708951 15.851531 13.097656 15.957031 C 13.486361 16.062431 13.860592 16.001103 14.171875 15.845703 C 14.483158 15.690103 14.757363 15.426934 14.90625 15.052734 C 15.055137 14.678434 15.028581 14.199072 14.839844 13.826172 L 13.837891 11.826172 C 14.206932 12.014472 14.677706 12.064675 15.050781 11.921875 C 15.437086 11.773775 15.703682 11.494334 15.861328 11.177734 C 16.018975 10.861034 16.08146 10.479531 15.966797 10.082031 C 15.852134 9.6844312 15.520882 9.3127719 15.130859 9.1386719 L 13.074219 8.1113281 L 12.744141 8.0019531 L 13.310547 7.8125 L 15.544922 5.5761719 C 15.849628 5.2841719 16.036225 4.8308281 16.015625 4.4238281 C 15.995025 4.0167281 15.816255 3.6795406 15.568359 3.4316406 C 15.320464 3.1837406 14.98324 3.004975 14.576172 2.984375 C 14.513432 2.984375 14.462565 3.0506406 14.398438 3.0566406 L 14.839844 2.1757812 C 15.028577 1.8028812 15.055133 1.3235187 14.90625 0.94921875 C 14.757363 0.57501875 14.483158 0.31185 14.171875 0.15625 C 13.860592 0.00065 13.486361 -0.060478125 13.097656 0.044921875 C 12.708951 0.15042187 12.34127 0.45928437 12.15625 0.83398438 L 11.267578 2.6132812 L 10.585938 3.2929688 C 10.584418 3.2335193 10.599191 3.1798879 10.59375 3.1191406 C 10.54852 2.6140406 10.33391 2.0419 9.8652344 1.625 C 9.396559 1.2081 8.7358627 1 8 1 C 7.2641372 1 6.6053942 1.2081 6.1367188 1.625 C 5.6680433 2.0419 5.4514778 2.6140406 5.40625 3.1191406 C 5.4008094 3.1798879 5.415582 3.2335193 5.4140625 3.2929688 L 4.7324219 2.6132812 L 3.8476562 0.84375 C 3.6041866 0.33745 3.0927637 0.007340625 2.53125 -0.005859375 L 2.5292969 -0.005859375 z "
transform="translate(0,1036.3622)"
id="path4323" />
<path
id="path4177"
style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="m 14.5,1046.8622 -2,-1 -4.5,-1.5 m 6.5,-3.5 -2,2 -4.5,1.5 m 5.5,6.5 -1,-2 -4.5,-4.5 m 5.5,-6.5 -1,2 -4.5,4.5 m -6.5,2.5 2,-1 4.5,-1.5 m -6.5,-3.5 2,2 4.5,1.5 m -5.5,6.5 1,-2 4.5,-4.5 m -5.5,-6.5 1,2 4.5,4.5" />
<circle
style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4147"
cx="8"
cy="1044.3622"
r="2" />
<g
id="g4338">
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path4153"
d="m 8,1038.3622 c -1.2288301,0.739 -0.8053557,1.5281 -0.4408867,1.803 l -0.5726601,0.8152 C 6.322151,1040.7104 5.7536947,1038.4016 8,1038.3622 Z"
style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<circle
r="1.5"
style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle4149"
cx="8"
cy="1041.3622" />
<circle
style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle4151"
cx="8"
cy="1048.3622"
r="3" />
<path
style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 8,1038.3622 c 1.2288301,0.739 0.8053557,1.5281 0.4408867,1.803 l 0.5726601,0.8152 C 9.677849,1040.7104 10.246305,1038.4016 8,1038.3622 Z"
id="path4273"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<circle
style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle4317"
cx="8"
cy="1044.3622"
r="2" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

103
sourceImages/toastIcon.svg Normal file
View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 16 16"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="toastIcon.svg">
<defs
id="defs4">
<filter
style="color-interpolation-filters:sRGB"
id="filter4162"
inkscape:label="grain">
<feTurbulence
id="feTurbulence4164"
baseFrequency="0.5"
result="result1"
numOctaves="2" />
<feColorMatrix
id="feColorMatrix4182"
values="0.5 0.5 0 0 0 0.5 0.5 0 0 0 0.5 0.5 0 0 0 0 0 0 0 1 "
result="result2" />
<feComposite
id="feComposite4190"
operator="arithmetic"
k1="0"
k2="0.25"
k3="1"
in2="SourceGraphic"
k4="0" />
<feComposite
id="feComposite4188"
in2="SourceAlpha"
operator="in"
result="result3" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="35.885669"
inkscape:cx="12.046646"
inkscape:cy="5.1233435"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="990"
inkscape:window-x="-2"
inkscape:window-y="32"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid4136"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<path
id="path4140"
style="opacity:1;fill:#c39f22;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4162)"
d="m 12.5,1049.8622 0,-7 c 1.5,0 3.5,-4 -4.5,-4 -8,0 -6,4 -4.5,4 l 0,7 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cczccc" />
<path
sodipodi:nodetypes="cczccc"
inkscape:connector-curvature="0"
d="m 3.5,1049.8622 0,-7 c -1.5,0 -3.5,-4 4.5,-4 8,0 6,4 4.5,4 l 0,7 z"
style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#5b4627;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4166" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

100
sourceImages/waterIcon.svg Normal file
View File

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 16 16"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="waterIcon.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="35.885669"
inkscape:cx="10.484131"
inkscape:cy="7.1142886"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:snap-global="false"
inkscape:window-width="1920"
inkscape:window-height="990"
inkscape:window-x="-2"
inkscape:window-y="32"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid4136"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.25;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 8.0078125 0 C 6.8978249 0 6.0233599 0.23235625 5.3710938 0.66015625 C 4.7188275 1.0876563 4.2514137 1.7888687 4.2539062 2.6054688 C 4.2561487 3.3409704 4.6453151 3.9686704 5.1972656 4.4003906 C 4.9503089 4.411159 4.7049169 4.4229795 4.515625 4.4667969 C 4.078049 4.5681969 3.693695 4.7594 3.4375 5.0625 C 2.92511 5.6689 3.0039063 6.3768 3.0039062 7.25 L 3.0039062 13.664062 C 3.0039062 14.118363 3.0029125 14.461778 3.0390625 14.767578 C 3.0752725 15.073578 3.1586916 15.395725 3.4316406 15.640625 C 3.7045926 15.885425 4.0456264 15.949763 4.3652344 15.976562 C 4.6848424 16.003563 5.0382891 15.998047 5.5019531 15.998047 L 10.498047 15.998047 C 10.961708 15.998047 11.317105 16.009562 11.636719 15.976562 C 11.956333 15.949562 12.295422 15.885725 12.568359 15.640625 C 12.841295 15.395725 12.926679 15.073578 12.962891 14.767578 C 12.999091 14.461778 12.996094 14.118362 12.996094 13.664062 L 12.996094 7.25 C 12.996094 6.3768 13.076837 5.6689 12.564453 5.0625 C 12.308258 4.7594 11.919998 4.5678969 11.482422 4.4667969 C 11.296142 4.423677 11.057367 4.4110754 10.814453 4.4003906 C 11.366833 3.9686704 11.759474 3.3409704 11.761719 2.6054688 C 11.764219 1.7888687 11.294844 1.0876563 10.642578 0.66015625 C 9.9903125 0.23245625 9.1178005 0 8.0078125 0 z "
transform="translate(0,1036.3622)"
id="path4180" />
<path
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.25"
d="m 8.0078125,1.5 c -2.4484074,0 -2.8967196,1.4546037 -1.3710937,2 L 6.5,3.5 l 0,2 c -2.029654,0 -2,0.4961 -2,2 l 0,5.5 c 0,1.557 0.00227,1.5 1.5,1.5 l 4,0 c 1.4977,0 1.5,0.0569 1.5,-1.5 l 0,-5.5 c 0,-1.5039 0.02965,-2 -2,-2 l 0,-2 -0.1210938,0 C 10.904532,2.9546037 10.45622,1.5 8.0078125,1.5 Z"
id="path4147"
inkscape:connector-curvature="0"
sodipodi:nodetypes="scccsssssscccs"
transform="translate(0,1036.3622)" />
<path
id="path4167"
style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
d="m 9.9974158,1050.8622 c 1.4977302,0 1.5000002,0.057 1.5000002,-1.5 l 0,-5.5 c -2.3948142,0.2992 -4.8176859,0.3278 -7.0009762,0 l 0,5.5 c 0,1.557 0.00227,1.5 1.5,1.5 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csccscc" />
<path
id="path4170"
style="fill:#00ff19;fill-opacity:1;fill-rule:evenodd;stroke:#2500ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
d="m 11.497416,1043.8622 c -2.3948142,0.2992 -4.8176859,0.3278 -7.0009762,0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="ccssccsscc"
inkscape:connector-curvature="0"
d="m 9.5,1039.8622 0,2 c 2.029654,0 2,0.4961 2,2 l 0,5.5 c 0,1.5569 -0.0023,1.5 -1.5,1.5 l -4,0 c -1.49773,0 -1.5,0.057 -1.5,-1.5 l 0,-5.5 c 0,-1.5039 -0.029654,-2 2,-2 l 0,-2"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#c8ffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4165" />
<path
sodipodi:nodetypes="zzz"
inkscape:connector-curvature="0"
d="m 8.0071064,1037.8622 c -3.0134245,0 -2.997398,2.2031 0,2.2031 2.9973976,0 3.0134246,-2.2031 0,-2.2031 z"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#c8ffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4177" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB