Merge branch 'master' into autolabor
| 
		 After Width: | Height: | Size: 5.8 KiB  | 
| 
		 Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.6 KiB  | 
| 
		 Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 7.6 KiB  | 
| 
		 After Width: | Height: | Size: 5.0 KiB  | 
| 
		 Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 5.6 KiB  | 
@ -1,70 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
https://github.com/peterix/dfhack
 | 
			
		||||
Copyright (c) 2009-2012 Petr Mrázek (peterix@gmail.com)
 | 
			
		||||
 | 
			
		||||
This software is provided 'as-is', without any express or implied
 | 
			
		||||
warranty. In no event will the authors be held liable for any
 | 
			
		||||
damages arising from the use of this software.
 | 
			
		||||
 | 
			
		||||
Permission is granted to anyone to use this software for any
 | 
			
		||||
purpose, including commercial applications, and to alter it and
 | 
			
		||||
redistribute it freely, subject to the following restrictions:
 | 
			
		||||
 | 
			
		||||
1. The origin of this software must not be misrepresented; you must
 | 
			
		||||
not claim that you wrote the original software. If you use this
 | 
			
		||||
software in a product, an acknowledgment in the product documentation
 | 
			
		||||
would be appreciated but is not required.
 | 
			
		||||
 | 
			
		||||
2. Altered source versions must be plainly marked as such, and
 | 
			
		||||
must not be misrepresented as being the original software.
 | 
			
		||||
 | 
			
		||||
3. This notice may not be removed or altered from any source
 | 
			
		||||
distribution.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#ifndef CL_MOD_VEGETATION
 | 
			
		||||
#define CL_MOD_VEGETATION
 | 
			
		||||
/**
 | 
			
		||||
 * \defgroup grp_vegetation Vegetation : stuff that grows and gets cut down or trampled by dwarves
 | 
			
		||||
 * @ingroup grp_modules
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "Export.h"
 | 
			
		||||
#include "DataDefs.h"
 | 
			
		||||
#include "df/plant.h"
 | 
			
		||||
 | 
			
		||||
namespace DFHack
 | 
			
		||||
{
 | 
			
		||||
namespace Vegetation
 | 
			
		||||
{
 | 
			
		||||
const uint32_t sapling_to_tree_threshold = 120 * 28 * 12 * 3; // 3 years
 | 
			
		||||
 | 
			
		||||
// "Simplified" copy of plant
 | 
			
		||||
struct t_plant {
 | 
			
		||||
    df::language_name name;
 | 
			
		||||
    df::plant_flags flags;
 | 
			
		||||
    int16_t material;
 | 
			
		||||
    df::coord pos;
 | 
			
		||||
    int32_t grow_counter;
 | 
			
		||||
    uint16_t temperature_1;
 | 
			
		||||
    uint16_t temperature_2;
 | 
			
		||||
    int32_t is_burning;
 | 
			
		||||
    int32_t hitpoints;
 | 
			
		||||
    int16_t update_order;
 | 
			
		||||
    //std::vector<void *> unk1;
 | 
			
		||||
    //int32_t unk2;
 | 
			
		||||
    //uint16_t temperature_3;
 | 
			
		||||
    //uint16_t temperature_4;
 | 
			
		||||
    //uint16_t temperature_5;
 | 
			
		||||
    // Pointer to original object, in case you want to modify it
 | 
			
		||||
    df::plant *origin;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
DFHACK_EXPORT bool isValid();
 | 
			
		||||
DFHACK_EXPORT uint32_t getCount();
 | 
			
		||||
DFHACK_EXPORT df::plant * getPlant(const int32_t index);
 | 
			
		||||
DFHACK_EXPORT bool copyPlant (const int32_t index, t_plant &out);
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
@ -1,85 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
https://github.com/peterix/dfhack
 | 
			
		||||
Copyright (c) 2009-2012 Petr Mrázek (peterix@gmail.com)
 | 
			
		||||
 | 
			
		||||
This software is provided 'as-is', without any express or implied
 | 
			
		||||
warranty. In no event will the authors be held liable for any
 | 
			
		||||
damages arising from the use of this software.
 | 
			
		||||
 | 
			
		||||
Permission is granted to anyone to use this software for any
 | 
			
		||||
purpose, including commercial applications, and to alter it and
 | 
			
		||||
redistribute it freely, subject to the following restrictions:
 | 
			
		||||
 | 
			
		||||
1. The origin of this software must not be misrepresented; you must
 | 
			
		||||
not claim that you wrote the original software. If you use this
 | 
			
		||||
software in a product, an acknowledgment in the product documentation
 | 
			
		||||
would be appreciated but is not required.
 | 
			
		||||
 | 
			
		||||
2. Altered source versions must be plainly marked as such, and
 | 
			
		||||
must not be misrepresented as being the original software.
 | 
			
		||||
 | 
			
		||||
3. This notice may not be removed or altered from any source
 | 
			
		||||
distribution.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "Internal.h"
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <map>
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
#include "VersionInfo.h"
 | 
			
		||||
#include "MemAccess.h"
 | 
			
		||||
#include "Types.h"
 | 
			
		||||
#include "Core.h"
 | 
			
		||||
using namespace DFHack;
 | 
			
		||||
 | 
			
		||||
#include "modules/Vegetation.h"
 | 
			
		||||
#include "df/world.h"
 | 
			
		||||
 | 
			
		||||
using namespace DFHack;
 | 
			
		||||
using df::global::world;
 | 
			
		||||
 | 
			
		||||
bool Vegetation::isValid()
 | 
			
		||||
{
 | 
			
		||||
    return (world != NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t Vegetation::getCount()
 | 
			
		||||
{
 | 
			
		||||
    return world->plants.all.size();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
df::plant * Vegetation::getPlant(const int32_t index)
 | 
			
		||||
{
 | 
			
		||||
    if (uint32_t(index) >= getCount())
 | 
			
		||||
        return NULL;
 | 
			
		||||
    return world->plants.all[index];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Vegetation::copyPlant(const int32_t index, t_plant &out)
 | 
			
		||||
{
 | 
			
		||||
    if (uint32_t(index) >= getCount())
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    out.origin = world->plants.all[index];
 | 
			
		||||
 | 
			
		||||
    out.name = out.origin->name;
 | 
			
		||||
    out.flags = out.origin->flags;
 | 
			
		||||
    out.material = out.origin->material;
 | 
			
		||||
    out.pos = out.origin->pos;
 | 
			
		||||
    out.grow_counter = out.origin->grow_counter;
 | 
			
		||||
    out.temperature_1 = out.origin->temperature.whole;
 | 
			
		||||
    out.temperature_2 = out.origin->temperature.fraction;
 | 
			
		||||
    out.is_burning = out.origin->is_burning;
 | 
			
		||||
    out.hitpoints = out.origin->hitpoints;
 | 
			
		||||
    out.update_order = out.origin->update_order;
 | 
			
		||||
    //out.unk1 = out.origin->anon_1;
 | 
			
		||||
    //out.unk2 = out.origin->anon_2;
 | 
			
		||||
    //out.temperature_3 = out.origin->temperature_unk;
 | 
			
		||||
    //out.temperature_4 = out.origin->min_safe_temp;
 | 
			
		||||
    //out.temperature_5 = out.origin->max_safe_temp;
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
Subproject commit 22b01b80ad1f0e82c609dec56f09be1a46788921
 | 
			
		||||
Subproject commit 506ab1e68d1522e2f282f134176b7da774f6a73c
 | 
			
		||||
@ -0,0 +1,103 @@
 | 
			
		||||
-- Read the tiles from the screen and display info about them.
 | 
			
		||||
 | 
			
		||||
local utils = require 'utils'
 | 
			
		||||
local gui = require 'gui'
 | 
			
		||||
 | 
			
		||||
InspectScreen = defclass(InspectScreen, gui.Screen)
 | 
			
		||||
 | 
			
		||||
function InspectScreen:init(args)
 | 
			
		||||
    local w,h = dfhack.screen.getWindowSize()
 | 
			
		||||
    self.cursor_x = math.floor(w/2)
 | 
			
		||||
    self.cursor_y = math.floor(h/2)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function InspectScreen:computeFrame(parent_rect)
 | 
			
		||||
    local sw, sh = parent_rect.width, parent_rect.height
 | 
			
		||||
    self.cursor_x = math.max(0, math.min(self.cursor_x, sw-1))
 | 
			
		||||
    self.cursor_y = math.max(0, math.min(self.cursor_y, sh-1))
 | 
			
		||||
 | 
			
		||||
    local frame = { w = 14, r = 1, h = 10, t = 1 }
 | 
			
		||||
    if self.cursor_x > sw/2 then
 | 
			
		||||
        frame = { w = 14, l = 1, h = 10, t = 1 }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    return gui.compute_frame_body(sw, sh, frame, 1, 0, false)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function InspectScreen:onRenderFrame(dc, rect)
 | 
			
		||||
    self:renderParent()
 | 
			
		||||
    self.cursor_pen = dfhack.screen.readTile(self.cursor_x, self.cursor_y)
 | 
			
		||||
    if gui.blink_visible(100) then
 | 
			
		||||
        dfhack.screen.paintTile({ch='X',fg=COLOR_LIGHTGREEN}, self.cursor_x, self.cursor_y)
 | 
			
		||||
    end
 | 
			
		||||
    dc:fill(rect, {ch=' ',fg=COLOR_WHITE,bg=COLOR_CYAN})
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local FG_PEN = {fg=COLOR_WHITE,bg=COLOR_BLACK,tile_color=true}
 | 
			
		||||
local BG_PEN = {fg=COLOR_BLACK,bg=COLOR_WHITE,tile_color=true}
 | 
			
		||||
local TXT_PEN = {fg=COLOR_WHITE}
 | 
			
		||||
 | 
			
		||||
function InspectScreen:onRenderBody(dc)
 | 
			
		||||
    dc:pen(COLOR_WHITE, COLOR_CYAN)
 | 
			
		||||
    if self.cursor_pen then
 | 
			
		||||
        local info = self.cursor_pen
 | 
			
		||||
        dc:string('CH: '):char(info.ch, FG_PEN):char(info.ch, BG_PEN):string(' '):string(''..info.ch,TXT_PEN):newline()
 | 
			
		||||
        local fgcolor = info.fg
 | 
			
		||||
        local fgstr = info.fg
 | 
			
		||||
        if info.bold then
 | 
			
		||||
            fgcolor = (fgcolor+8)%16
 | 
			
		||||
            fgstr = fgstr..'+8'
 | 
			
		||||
        end
 | 
			
		||||
        dc:string('FG: '):string('NN',{fg=fgcolor}):string(' '):string(''..fgstr,TXT_PEN)
 | 
			
		||||
        dc:seek(dc.width-1):char(info.ch,{fg=info.fg,bold=info.bold}):newline()
 | 
			
		||||
        dc:string('BG: '):string('NN',{fg=info.bg}):string(' '):string(''..info.bg,TXT_PEN)
 | 
			
		||||
        dc:seek(dc.width-1):char(info.ch,{fg=COLOR_BLACK,bg=info.bg}):newline()
 | 
			
		||||
        local bstring = 'false'
 | 
			
		||||
        if info.bold then bstring = 'true' end
 | 
			
		||||
        dc:string('Bold: '..bstring):newline():newline()
 | 
			
		||||
 | 
			
		||||
        if info.tile and gui.USE_GRAPHICS then
 | 
			
		||||
            dc:string('TL: '):tile(' ', info.tile, FG_PEN):tile(' ', info.tile, BG_PEN):string(' '..info.tile):newline()
 | 
			
		||||
            if info.tile_color then
 | 
			
		||||
                dc:string('Color: true')
 | 
			
		||||
            elseif info.tile_fg then
 | 
			
		||||
                dc:string('FG: '):string('NN',{fg=info.tile_fg}):string(' '):string(''..info.tile_fg,TXT_PEN):newline()
 | 
			
		||||
                dc:string('BG: '):string('NN',{fg=info.tile_bg}):string(' '):string(''..info.tile_bg,TXT_PEN):newline()
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    else
 | 
			
		||||
        dc:string('Invalid', COLOR_LIGHTRED)
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local MOVEMENT_KEYS = {
 | 
			
		||||
    CURSOR_UP = { 0, -1, 0 }, CURSOR_DOWN = { 0, 1, 0 },
 | 
			
		||||
    CURSOR_LEFT = { -1, 0, 0 }, CURSOR_RIGHT = { 1, 0, 0 },
 | 
			
		||||
    CURSOR_UPLEFT = { -1, -1, 0 }, CURSOR_UPRIGHT = { 1, -1, 0 },
 | 
			
		||||
    CURSOR_DOWNLEFT = { -1, 1, 0 }, CURSOR_DOWNRIGHT = { 1, 1, 0 },
 | 
			
		||||
    CURSOR_UP_FAST = { 0, -1, 0, true }, CURSOR_DOWN_FAST = { 0, 1, 0, true },
 | 
			
		||||
    CURSOR_LEFT_FAST = { -1, 0, 0, true }, CURSOR_RIGHT_FAST = { 1, 0, 0, true },
 | 
			
		||||
    CURSOR_UPLEFT_FAST = { -1, -1, 0, true }, CURSOR_UPRIGHT_FAST = { 1, -1, 0, true },
 | 
			
		||||
    CURSOR_DOWNLEFT_FAST = { -1, 1, 0, true }, CURSOR_DOWNRIGHT_FAST = { 1, 1, 0, true },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function InspectScreen:onInput(keys)
 | 
			
		||||
    if keys.LEAVESCREEN then
 | 
			
		||||
        self:dismiss()
 | 
			
		||||
    else
 | 
			
		||||
        for k,v in pairs(MOVEMENT_KEYS) do
 | 
			
		||||
            if keys[k] then
 | 
			
		||||
                local delta = 1
 | 
			
		||||
                if v[4] then
 | 
			
		||||
                    delta = 10
 | 
			
		||||
                end
 | 
			
		||||
                self.cursor_x = self.cursor_x + delta*v[1]
 | 
			
		||||
                self.cursor_y = self.cursor_y + delta*v[2]
 | 
			
		||||
                self:updateLayout()
 | 
			
		||||
                return
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
InspectScreen{}:show()
 | 
			
		||||
@ -0,0 +1,26 @@
 | 
			
		||||
-- On map load writes the current season to gamelog.txt
 | 
			
		||||
 | 
			
		||||
local seasons = {
 | 
			
		||||
    [0] = 'Spring',
 | 
			
		||||
    [1] = 'Summer',
 | 
			
		||||
    [2] = 'Autumn',
 | 
			
		||||
    [3] = 'Winter',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local args = {...}
 | 
			
		||||
 | 
			
		||||
local function write_gamelog(msg)
 | 
			
		||||
    local log = io.open('gamelog.txt', 'a')
 | 
			
		||||
    log:write(msg.."\n")
 | 
			
		||||
    log:close()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if args[1] == 'disable' then
 | 
			
		||||
    dfhack.onStateChange[_ENV] = nil
 | 
			
		||||
else
 | 
			
		||||
    dfhack.onStateChange[_ENV] = function(op)
 | 
			
		||||
        if op == SC_WORLD_LOADED then
 | 
			
		||||
            write_gamelog(seasons[df.global.cur_season]..' has arrived on the calendar.')
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||