Merge branch 'develop' of github.com:DFHack/dfhack into remote_reader
Conflicts: plugins/remotefortressreader.cppdevelop
commit
5add8c433d
@ -1,832 +0,0 @@
|
||||
/*
|
||||
https://github.com/peterix/dfhack
|
||||
|
||||
A thread-safe logging console with a line editor.
|
||||
|
||||
Based on linenoise:
|
||||
linenoise -- guerrilla line editing library against the idea that a
|
||||
line editing lib needs to be 20,000 lines of C code.
|
||||
|
||||
You can find the latest source code at:
|
||||
|
||||
http://github.com/antirez/linenoise
|
||||
|
||||
Does a number of crazy assumptions that happen to be true in 99.9999% of
|
||||
the 2010 UNIX computers around.
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2010, Salvatore Sanfilippo <antirez at gmail dot com>
|
||||
Copyright (c) 2010, Pieter Noordhuis <pcnoordhuis at gmail dot com>
|
||||
Copyright (c) 2011, Petr Mrázek <peterix@gmail.com>
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <string.h>
|
||||
#include <string>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <termios.h>
|
||||
#include <errno.h>
|
||||
#include <deque>
|
||||
|
||||
// George Vulov for MacOSX
|
||||
#ifndef __LINUX__
|
||||
#define TEMP_FAILURE_RETRY(expr) \
|
||||
({ long int _res; \
|
||||
do _res = (long int) (expr); \
|
||||
while (_res == -1L && errno == EINTR); \
|
||||
_res; })
|
||||
#endif
|
||||
|
||||
#include "Console.h"
|
||||
#include "Hooks.h"
|
||||
using namespace DFHack;
|
||||
|
||||
#include "tinythread.h"
|
||||
using namespace tthread;
|
||||
|
||||
static int isUnsupportedTerm(void)
|
||||
{
|
||||
static const char *unsupported_term[] = {"dumb","cons25",NULL};
|
||||
char *term = getenv("TERM");
|
||||
int j;
|
||||
|
||||
if (term == NULL) return 0;
|
||||
for (j = 0; unsupported_term[j]; j++)
|
||||
if (!strcasecmp(term,unsupported_term[j])) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char * ANSI_CLS = "\033[2J";
|
||||
const char * ANSI_BLACK = "\033[22;30m";
|
||||
const char * ANSI_RED = "\033[22;31m";
|
||||
const char * ANSI_GREEN = "\033[22;32m";
|
||||
const char * ANSI_BROWN = "\033[22;33m";
|
||||
const char * ANSI_BLUE = "\033[22;34m";
|
||||
const char * ANSI_MAGENTA = "\033[22;35m";
|
||||
const char * ANSI_CYAN = "\033[22;36m";
|
||||
const char * ANSI_GREY = "\033[22;37m";
|
||||
const char * ANSI_DARKGREY = "\033[01;30m";
|
||||
const char * ANSI_LIGHTRED = "\033[01;31m";
|
||||
const char * ANSI_LIGHTGREEN = "\033[01;32m";
|
||||
const char * ANSI_YELLOW = "\033[01;33m";
|
||||
const char * ANSI_LIGHTBLUE = "\033[01;34m";
|
||||
const char * ANSI_LIGHTMAGENTA = "\033[01;35m";
|
||||
const char * ANSI_LIGHTCYAN = "\033[01;36m";
|
||||
const char * ANSI_WHITE = "\033[01;37m";
|
||||
const char * RESETCOLOR = "\033[0m";
|
||||
|
||||
const char * getANSIColor(const int c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case -1: return RESETCOLOR; // HACK! :P
|
||||
case 0 : return ANSI_BLACK;
|
||||
case 1 : return ANSI_BLUE; // non-ANSI
|
||||
case 2 : return ANSI_GREEN;
|
||||
case 3 : return ANSI_CYAN; // non-ANSI
|
||||
case 4 : return ANSI_RED; // non-ANSI
|
||||
case 5 : return ANSI_MAGENTA;
|
||||
case 6 : return ANSI_BROWN;
|
||||
case 7 : return ANSI_GREY;
|
||||
case 8 : return ANSI_DARKGREY;
|
||||
case 9 : return ANSI_LIGHTBLUE; // non-ANSI
|
||||
case 10: return ANSI_LIGHTGREEN;
|
||||
case 11: return ANSI_LIGHTCYAN; // non-ANSI;
|
||||
case 12: return ANSI_LIGHTRED; // non-ANSI;
|
||||
case 13: return ANSI_LIGHTMAGENTA;
|
||||
case 14: return ANSI_YELLOW; // non-ANSI
|
||||
case 15: return ANSI_WHITE;
|
||||
default: return "";
|
||||
}
|
||||
}
|
||||
|
||||
namespace DFHack
|
||||
{
|
||||
class Private
|
||||
{
|
||||
public:
|
||||
Private()
|
||||
{
|
||||
dfout_C = NULL;
|
||||
rawmode = false;
|
||||
in_batch = false;
|
||||
supported_terminal = false;
|
||||
state = con_unclaimed;
|
||||
};
|
||||
virtual ~Private()
|
||||
{
|
||||
//sync();
|
||||
}
|
||||
private:
|
||||
bool read_char(unsigned char & out)
|
||||
{
|
||||
FD_ZERO(&descriptor_set);
|
||||
FD_SET(STDIN_FILENO, &descriptor_set);
|
||||
FD_SET(exit_pipe[0], &descriptor_set);
|
||||
int ret = TEMP_FAILURE_RETRY(
|
||||
select (FD_SETSIZE,&descriptor_set, NULL, NULL, NULL)
|
||||
);
|
||||
if(ret == -1)
|
||||
return false;
|
||||
if (FD_ISSET(exit_pipe[0], &descriptor_set))
|
||||
return false;
|
||||
if (FD_ISSET(STDIN_FILENO, &descriptor_set))
|
||||
{
|
||||
// read byte from stdin
|
||||
ret = TEMP_FAILURE_RETRY(
|
||||
read(STDIN_FILENO, &out, 1)
|
||||
);
|
||||
if(ret == -1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public:
|
||||
void print(const char *data)
|
||||
{
|
||||
fputs(data, dfout_C);
|
||||
}
|
||||
|
||||
void print_text(color_ostream::color_value clr, const std::string &chunk)
|
||||
{
|
||||
if(!in_batch && state == con_lineedit)
|
||||
{
|
||||
disable_raw();
|
||||
fprintf(dfout_C,"\x1b[1G");
|
||||
fprintf(dfout_C,"\x1b[0K");
|
||||
|
||||
color(clr);
|
||||
print(chunk.c_str());
|
||||
|
||||
reset_color();
|
||||
enable_raw();
|
||||
prompt_refresh();
|
||||
}
|
||||
else
|
||||
{
|
||||
color(clr);
|
||||
print(chunk.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void begin_batch()
|
||||
{
|
||||
assert(!in_batch);
|
||||
|
||||
in_batch = true;
|
||||
|
||||
if (state == con_lineedit)
|
||||
{
|
||||
disable_raw();
|
||||
fprintf(dfout_C,"\x1b[1G");
|
||||
fprintf(dfout_C,"\x1b[0K");
|
||||
}
|
||||
}
|
||||
|
||||
void end_batch()
|
||||
{
|
||||
assert(in_batch);
|
||||
|
||||
flush();
|
||||
|
||||
in_batch = false;
|
||||
|
||||
if (state == con_lineedit)
|
||||
{
|
||||
reset_color();
|
||||
enable_raw();
|
||||
prompt_refresh();
|
||||
}
|
||||
}
|
||||
|
||||
void flush()
|
||||
{
|
||||
if (!rawmode)
|
||||
fflush(dfout_C);
|
||||
}
|
||||
|
||||
/// Clear the console, along with its scrollback
|
||||
void clear()
|
||||
{
|
||||
if(rawmode)
|
||||
{
|
||||
const char * clr = "\033c\033[3J\033[H";
|
||||
::write(STDIN_FILENO,clr,strlen(clr));
|
||||
}
|
||||
else
|
||||
{
|
||||
print("\033c\033[3J\033[H");
|
||||
fflush(dfout_C);
|
||||
}
|
||||
}
|
||||
/// Position cursor at x,y. 1,1 = top left corner
|
||||
void gotoxy(int x, int y)
|
||||
{
|
||||
char tmp[64];
|
||||
sprintf(tmp,"\033[%d;%dH", y,x);
|
||||
print(tmp);
|
||||
}
|
||||
/// Set color (ANSI color number)
|
||||
void color(Console::color_value index)
|
||||
{
|
||||
if(!rawmode)
|
||||
fprintf(dfout_C,getANSIColor(index));
|
||||
else
|
||||
{
|
||||
const char * colstr = getANSIColor(index);
|
||||
int lstr = strlen(colstr);
|
||||
::write(STDIN_FILENO,colstr,lstr);
|
||||
}
|
||||
}
|
||||
/// Reset color to default
|
||||
void reset_color(void)
|
||||
{
|
||||
color(COLOR_RESET);
|
||||
if(!rawmode)
|
||||
fflush(dfout_C);
|
||||
}
|
||||
/// Enable or disable the caret/cursor
|
||||
void cursor(bool enable = true)
|
||||
{
|
||||
if(enable)
|
||||
print("\033[?25h");
|
||||
else
|
||||
print("\033[?25l");
|
||||
}
|
||||
/// Waits given number of milliseconds before continuing.
|
||||
void msleep(unsigned int msec);
|
||||
/// get the current number of columns
|
||||
int get_columns(void)
|
||||
{
|
||||
winsize ws;
|
||||
if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == -1) return 80;
|
||||
return ws.ws_col;
|
||||
}
|
||||
/// get the current number of rows
|
||||
int get_rows(void)
|
||||
{
|
||||
winsize ws;
|
||||
if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == -1) return 25;
|
||||
return ws.ws_row;
|
||||
}
|
||||
/// beep. maybe?
|
||||
//void beep (void);
|
||||
void back_word()
|
||||
{
|
||||
if (raw_cursor == 0)
|
||||
return;
|
||||
raw_cursor--;
|
||||
while (raw_cursor > 0 && !isalnum(raw_buffer[raw_cursor]))
|
||||
raw_cursor--;
|
||||
while (raw_cursor > 0 && isalnum(raw_buffer[raw_cursor]))
|
||||
raw_cursor--;
|
||||
if (!isalnum(raw_buffer[raw_cursor]) && raw_cursor != 0)
|
||||
raw_cursor++;
|
||||
prompt_refresh();
|
||||
}
|
||||
void forward_word()
|
||||
{
|
||||
int len = raw_buffer.size();
|
||||
if (raw_cursor == len)
|
||||
return;
|
||||
raw_cursor++;
|
||||
while (raw_cursor <= len && !isalnum(raw_buffer[raw_cursor]))
|
||||
raw_cursor++;
|
||||
while (raw_cursor <= len && isalnum(raw_buffer[raw_cursor]))
|
||||
raw_cursor++;
|
||||
if (raw_cursor > len)
|
||||
raw_cursor = len;
|
||||
prompt_refresh();
|
||||
}
|
||||
/// A simple line edit (raw mode)
|
||||
int lineedit(const std::string& prompt, std::string& output, recursive_mutex * lock, CommandHistory & ch)
|
||||
{
|
||||
output.clear();
|
||||
reset_color();
|
||||
this->prompt = prompt;
|
||||
if (!supported_terminal)
|
||||
{
|
||||
print(prompt.c_str());
|
||||
fflush(dfout_C);
|
||||
// FIXME: what do we do here???
|
||||
//SDL_recursive_mutexV(lock);
|
||||
std::getline(std::cin, output);
|
||||
//SDL_recursive_mutexP(lock);
|
||||
return output.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
int count;
|
||||
if (enable_raw() == -1) return 0;
|
||||
if(state == con_lineedit)
|
||||
return -1;
|
||||
state = con_lineedit;
|
||||
count = prompt_loop(lock,ch);
|
||||
state = con_unclaimed;
|
||||
disable_raw();
|
||||
print("\n");
|
||||
if(count != -1)
|
||||
{
|
||||
output = raw_buffer;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
int enable_raw()
|
||||
{
|
||||
struct termios raw;
|
||||
|
||||
if (!supported_terminal)
|
||||
return -1;
|
||||
if (tcgetattr(STDIN_FILENO,&orig_termios) == -1)
|
||||
return -1;
|
||||
|
||||
raw = orig_termios; //modify the original mode
|
||||
// input modes: no break, no CR to NL, no parity check, no strip char,
|
||||
// no start/stop output control.
|
||||
raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
|
||||
// output modes - disable post processing
|
||||
raw.c_oflag &= ~(OPOST);
|
||||
// control modes - set 8 bit chars
|
||||
raw.c_cflag |= (CS8);
|
||||
// local modes - choing off, canonical off, no extended functions,
|
||||
// no signal chars (^Z,^C)
|
||||
#ifdef CONSOLE_NO_CATCH
|
||||
raw.c_lflag &= ~( ECHO | ICANON | IEXTEN );
|
||||
#else
|
||||
raw.c_lflag &= ~( ECHO | ICANON | IEXTEN | ISIG );
|
||||
#endif
|
||||
// control chars - set return condition: min number of bytes and timer.
|
||||
// We want read to return every single byte, without timeout.
|
||||
raw.c_cc[VMIN] = 1; raw.c_cc[VTIME] = 0;// 1 byte, no timer
|
||||
// put terminal in raw mode after flushing
|
||||
if (tcsetattr(STDIN_FILENO,TCSAFLUSH,&raw) < 0)
|
||||
return -1;
|
||||
rawmode = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void disable_raw()
|
||||
{
|
||||
/* Don't even check the return value as it's too late. */
|
||||
if (rawmode && tcsetattr(STDIN_FILENO,TCSAFLUSH,&orig_termios) != -1)
|
||||
rawmode = 0;
|
||||
}
|
||||
void prompt_refresh()
|
||||
{
|
||||
char seq[64];
|
||||
int cols = get_columns();
|
||||
int plen = prompt.size();
|
||||
const char * buf = raw_buffer.c_str();
|
||||
int len = raw_buffer.size();
|
||||
int cooked_cursor = raw_cursor;
|
||||
// Use math! This is silly.
|
||||
while((plen+cooked_cursor) >= cols)
|
||||
{
|
||||
buf++;
|
||||
len--;
|
||||
cooked_cursor--;
|
||||
}
|
||||
while (plen+len > cols)
|
||||
{
|
||||
len--;
|
||||
}
|
||||
/* Cursor to left edge */
|
||||
snprintf(seq,64,"\x1b[1G");
|
||||
if (::write(STDIN_FILENO,seq,strlen(seq)) == -1) return;
|
||||
/* Write the prompt and the current buffer content */
|
||||
if (::write(STDIN_FILENO,prompt.c_str(),plen) == -1) return;
|
||||
if (::write(STDIN_FILENO,buf,len) == -1) return;
|
||||
/* Erase to right */
|
||||
snprintf(seq,64,"\x1b[0K");
|
||||
if (::write(STDIN_FILENO,seq,strlen(seq)) == -1) return;
|
||||
/* Move cursor to original position. */
|
||||
snprintf(seq,64,"\x1b[1G\x1b[%dC", (int)(cooked_cursor+plen));
|
||||
if (::write(STDIN_FILENO,seq,strlen(seq)) == -1) return;
|
||||
}
|
||||
|
||||
int prompt_loop(recursive_mutex * lock, CommandHistory & history)
|
||||
{
|
||||
int fd = STDIN_FILENO;
|
||||
size_t plen = prompt.size();
|
||||
int history_index = 0;
|
||||
raw_buffer.clear();
|
||||
raw_cursor = 0;
|
||||
/* The latest history entry is always our current buffer, that
|
||||
* initially is just an empty string. */
|
||||
const std::string empty;
|
||||
history.add(empty);
|
||||
if (::write(fd,prompt.c_str(),prompt.size()) == -1) return -1;
|
||||
while(1)
|
||||
{
|
||||
unsigned char c;
|
||||
int isok;
|
||||
unsigned char seq[2], seq2;
|
||||
lock->unlock();
|
||||
if(!read_char(c))
|
||||
{
|
||||
lock->lock();
|
||||
return -2;
|
||||
}
|
||||
lock->lock();
|
||||
/* Only autocomplete when the callback is set. It returns < 0 when
|
||||
* there was an error reading from fd. Otherwise it will return the
|
||||
* character that should be handled next. */
|
||||
if (c == 9)
|
||||
{
|
||||
/*
|
||||
if( completionCallback != NULL) {
|
||||
c = completeLine(fd,prompt,buf,buflen,&len,&pos,cols);
|
||||
// Return on errors
|
||||
if (c < 0) return len;
|
||||
// Read next character when 0
|
||||
if (c == 0) continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ignore tab
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
// just ignore tabs
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(c)
|
||||
{
|
||||
case 13: // enter
|
||||
history.remove();
|
||||
return raw_buffer.size();
|
||||
case 3: // ctrl-c
|
||||
errno = EAGAIN;
|
||||
return -1;
|
||||
case 127: // backspace
|
||||
case 8: // ctrl-h
|
||||
if (raw_cursor > 0 && raw_buffer.size() > 0)
|
||||
{
|
||||
raw_buffer.erase(raw_cursor-1,1);
|
||||
raw_cursor--;
|
||||
prompt_refresh();
|
||||
}
|
||||
break;
|
||||
case 27: // escape sequence
|
||||
lock->unlock();
|
||||
if (!read_char(seq[0]))
|
||||
{
|
||||
lock->lock();
|
||||
return -2;
|
||||
}
|
||||
lock->lock();
|
||||
if (seq[0] == 'b')
|
||||
{
|
||||
back_word();
|
||||
}
|
||||
else if (seq[0] == 'f')
|
||||
{
|
||||
forward_word();
|
||||
}
|
||||
else if(seq[0] == '[')
|
||||
{
|
||||
if (!read_char(seq[1]))
|
||||
{
|
||||
lock->lock();
|
||||
return -2;
|
||||
}
|
||||
if (seq[1] == 'D')
|
||||
{
|
||||
left_arrow:
|
||||
if (raw_cursor > 0)
|
||||
{
|
||||
raw_cursor--;
|
||||
prompt_refresh();
|
||||
}
|
||||
}
|
||||
else if ( seq[1] == 'C')
|
||||
{
|
||||
right_arrow:
|
||||
/* right arrow */
|
||||
if (size_t(raw_cursor) != raw_buffer.size())
|
||||
{
|
||||
raw_cursor++;
|
||||
prompt_refresh();
|
||||
}
|
||||
}
|
||||
else if (seq[1] == 'A' || seq[1] == 'B')
|
||||
{
|
||||
/* up and down arrow: history */
|
||||
if (history.size() > 1)
|
||||
{
|
||||
/* Update the current history entry before to
|
||||
* overwrite it with tne next one. */
|
||||
history[history_index] = raw_buffer;
|
||||
/* Show the new entry */
|
||||
history_index += (seq[1] == 'A') ? 1 : -1;
|
||||
if (history_index < 0)
|
||||
{
|
||||
history_index = 0;
|
||||
break;
|
||||
}
|
||||
else if (size_t(history_index) >= history.size())
|
||||
{
|
||||
history_index = history.size()-1;
|
||||
break;
|
||||
}
|
||||
raw_buffer = history[history_index];
|
||||
raw_cursor = raw_buffer.size();
|
||||
prompt_refresh();
|
||||
}
|
||||
}
|
||||
else if(seq[1] == 'H')
|
||||
{
|
||||
// home
|
||||
raw_cursor = 0;
|
||||
prompt_refresh();
|
||||
}
|
||||
else if(seq[1] == 'F')
|
||||
{
|
||||
// end
|
||||
raw_cursor = raw_buffer.size();
|
||||
prompt_refresh();
|
||||
}
|
||||
else if (seq[1] > '0' && seq[1] < '7')
|
||||
{
|
||||
// extended escape
|
||||
unsigned char seq3[3];
|
||||
lock->unlock();
|
||||
if(!read_char(seq2))
|
||||
{
|
||||
lock->lock();
|
||||
return -2;
|
||||
}
|
||||
lock->lock();
|
||||
if (seq[1] == '3' && seq2 == '~' )
|
||||
{
|
||||
// delete
|
||||
if (raw_buffer.size() > 0 && size_t(raw_cursor) < raw_buffer.size())
|
||||
{
|
||||
raw_buffer.erase(raw_cursor,1);
|
||||
prompt_refresh();
|
||||
}
|
||||
}
|
||||
if (!read_char(seq3[0]) || !read_char(seq3[1]))
|
||||
{
|
||||
lock->lock();
|
||||
return -2;
|
||||
}
|
||||
if (seq2 == ';')
|
||||
{
|
||||
// Format: esc [ n ; n DIRECTION
|
||||
// Ignore first character (second "n")
|
||||
if (seq3[1] == 'C')
|
||||
{
|
||||
forward_word();
|
||||
}
|
||||
else if (seq3[1] == 'D')
|
||||
{
|
||||
back_word();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (raw_buffer.size() == size_t(raw_cursor))
|
||||
{
|
||||
raw_buffer.append(1,c);
|
||||
raw_cursor++;
|
||||
if (plen+raw_buffer.size() < size_t(get_columns()))
|
||||
{
|
||||
/* Avoid a full update of the line in the
|
||||
* trivial case. */
|
||||
if (::write(fd,&c,1) == -1) return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
prompt_refresh();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
raw_buffer.insert(raw_cursor,1,c);
|
||||
raw_cursor++;
|
||||
prompt_refresh();
|
||||
}
|
||||
break;
|
||||
case 21: // Ctrl+u, delete the whole line.
|
||||
raw_buffer.clear();
|
||||
raw_cursor = 0;
|
||||
prompt_refresh();
|
||||
break;
|
||||
case 11: // Ctrl+k, delete from current to end of line.
|
||||
raw_buffer.erase(raw_cursor);
|
||||
prompt_refresh();
|
||||
break;
|
||||
case 1: // Ctrl+a, go to the start of the line
|
||||
raw_cursor = 0;
|
||||
prompt_refresh();
|
||||
break;
|
||||
case 5: // ctrl+e, go to the end of the line
|
||||
raw_cursor = raw_buffer.size();
|
||||
prompt_refresh();
|
||||
break;
|
||||
case 12: // ctrl+l, clear screen
|
||||
clear();
|
||||
prompt_refresh();
|
||||
}
|
||||
}
|
||||
return raw_buffer.size();
|
||||
}
|
||||
FILE * dfout_C;
|
||||
bool supported_terminal;
|
||||
// state variables
|
||||
bool rawmode; // is raw mode active?
|
||||
termios orig_termios; // saved/restored by raw mode
|
||||
// current state
|
||||
enum console_state
|
||||
{
|
||||
con_unclaimed,
|
||||
con_lineedit
|
||||
} state;
|
||||
bool in_batch;
|
||||
std::string prompt; // current prompt string
|
||||
std::string raw_buffer; // current raw mode buffer
|
||||
int raw_cursor; // cursor position in the buffer
|
||||
// thread exit mechanism
|
||||
int exit_pipe[2];
|
||||
fd_set descriptor_set;
|
||||
};
|
||||
}
|
||||
|
||||
Console::Console()
|
||||
{
|
||||
d = 0;
|
||||
inited = false;
|
||||
// we can't create the mutex at this time. the SDL functions aren't hooked yet.
|
||||
wlock = new recursive_mutex();
|
||||
}
|
||||
Console::~Console()
|
||||
{
|
||||
if(inited)
|
||||
shutdown();
|
||||
if(wlock)
|
||||
delete wlock;
|
||||
if(d)
|
||||
delete d;
|
||||
}
|
||||
|
||||
bool Console::init(bool sharing)
|
||||
{
|
||||
if(sharing)
|
||||
{
|
||||
inited = false;
|
||||
return false;
|
||||
}
|
||||
freopen("stdout.log", "w", stdout);
|
||||
d = new Private();
|
||||
// make our own weird streams so our IO isn't redirected
|
||||
d->dfout_C = fopen("/dev/tty", "w");
|
||||
std::cin.tie(this);
|
||||
clear();
|
||||
d->supported_terminal = !isUnsupportedTerm() && isatty(STDIN_FILENO);
|
||||
// init the exit mechanism
|
||||
pipe(d->exit_pipe);
|
||||
FD_ZERO(&d->descriptor_set);
|
||||
FD_SET(STDIN_FILENO, &d->descriptor_set);
|
||||
FD_SET(d->exit_pipe[0], &d->descriptor_set);
|
||||
inited = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Console::shutdown(void)
|
||||
{
|
||||
if(!d)
|
||||
return true;
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
if(d->rawmode)
|
||||
d->disable_raw();
|
||||
d->print("\n");
|
||||
inited = false;
|
||||
// kill the thing
|
||||
close(d->exit_pipe[1]);
|
||||
return true;
|
||||
}
|
||||
|
||||
void Console::begin_batch()
|
||||
{
|
||||
//color_ostream::begin_batch();
|
||||
|
||||
wlock->lock();
|
||||
|
||||
if (inited)
|
||||
d->begin_batch();
|
||||
}
|
||||
|
||||
void Console::end_batch()
|
||||
{
|
||||
if (inited)
|
||||
d->end_batch();
|
||||
|
||||
wlock->unlock();
|
||||
}
|
||||
|
||||
void Console::flush_proxy()
|
||||
{
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
if (inited)
|
||||
d->flush();
|
||||
}
|
||||
|
||||
void Console::add_text(color_value color, const std::string &text)
|
||||
{
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
if (inited)
|
||||
d->print_text(color, text);
|
||||
}
|
||||
|
||||
int Console::get_columns(void)
|
||||
{
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
int ret = -1;
|
||||
if(inited)
|
||||
ret = d->get_columns();
|
||||
return ret;
|
||||
}
|
||||
|
||||
int Console::get_rows(void)
|
||||
{
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
int ret = -1;
|
||||
if(inited)
|
||||
ret = d->get_rows();
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Console::clear()
|
||||
{
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
if(inited)
|
||||
d->clear();
|
||||
}
|
||||
|
||||
void Console::gotoxy(int x, int y)
|
||||
{
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
if(inited)
|
||||
d->gotoxy(x,y);
|
||||
}
|
||||
|
||||
void Console::cursor(bool enable)
|
||||
{
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
if(inited)
|
||||
d->cursor(enable);
|
||||
}
|
||||
|
||||
int Console::lineedit(const std::string & prompt, std::string & output, CommandHistory & ch)
|
||||
{
|
||||
lock_guard <recursive_mutex> g(*wlock);
|
||||
int ret = -2;
|
||||
if(inited)
|
||||
ret = d->lineedit(prompt,output,wlock,ch);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Console::msleep (unsigned int msec)
|
||||
{
|
||||
if (msec > 1000) sleep(msec/1000000);
|
||||
usleep((msec % 1000000) * 1000);
|
||||
}
|
@ -1,142 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=1445
|
||||
|
||||
0x2ac6b
|
||||
CC CC CC CC CC
|
||||
66 39 E8 EB 53
|
||||
|
||||
.text:0042B86B loc_42B86B:
|
||||
.text:0042B86B cmp ax, bp
|
||||
.text:0042B86E jmp short loc_42B8C3
|
||||
|
||||
0x2ac7b
|
||||
CC CC CC CC CC
|
||||
E9 96 A2 00 00
|
||||
|
||||
.text:0042B87B loc_42B87B:
|
||||
.text:0042B87B jmp loc_435B16
|
||||
|
||||
0x2acc3
|
||||
CC CC CC CC CC CC CC CC CC CC CC CC CC
|
||||
75 0A 66 FF 4C 24 16 79 03 58 EB AC C3
|
||||
|
||||
.text:0042B8C3 loc_42B8C3:
|
||||
.text:0042B8C3 jnz short locret_42B8CF
|
||||
.text:0042B8C5 dec word ptr [esp+16h] ; 4+8+8+2
|
||||
.text:0042B8CA jns short locret_42B8CF
|
||||
.text:0042B8CC pop eax
|
||||
.text:0042B8CD jmp short loc_42B87B
|
||||
.text:0042B8CF locret_42B8CF:
|
||||
.text:0042B8CF retn
|
||||
|
||||
0x2b2a1
|
||||
CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
|
||||
66 C7 44 24 0E 01 00 8B 90 44 01 00 00 C3 CC
|
||||
|
||||
.text:0042BEA1 loc_42BEA1:
|
||||
.text:0042BEA1 mov word ptr [esp+0Eh], 1 ; 4+8+2
|
||||
.text:0042BEA8 mov edx, [eax+144h]
|
||||
.text:0042BEAE retn
|
||||
|
||||
0x34d91
|
||||
8B 90 44 01 00 00
|
||||
E8 0B 65 FF FF 90
|
||||
|
||||
<<<<
|
||||
.text:00435991 mov edx, [eax+144h]
|
||||
====
|
||||
.text:00435991 call loc_42BEA1
|
||||
.text:00435996 nop
|
||||
>>>>
|
||||
|
||||
0x34e53
|
||||
0F 84 BD 00 00 00
|
||||
E8 6B 5E FF FF 90
|
||||
|
||||
<<<<
|
||||
.text:00435A53 jz loc_435B16
|
||||
====
|
||||
.text:00435A53 call loc_42B8C3
|
||||
.text:00435A58 nop
|
||||
>>>>
|
||||
|
||||
0x34ef3
|
||||
66 3B C5 74 1E
|
||||
E8 73 5D FF FF
|
||||
|
||||
<<<<
|
||||
.text:00435AF3 cmp ax, bp
|
||||
.text:00435AF6 jz short loc_435B16
|
||||
====
|
||||
.text:00435AF3 call loc_42B86B
|
||||
>>>>
|
||||
|
||||
|
||||
basically:
|
||||
|
||||
+ int allowed_count = 1; // to mean 2
|
||||
...
|
||||
- if (type(item) == new_type)
|
||||
+ if (type(item) == new_type && --allowed_count < 0)
|
||||
return false;
|
||||
|
||||
to allow up to two items of the same type at the same time
|
||||
|
||||
|
||||
---8<---
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf Fortress.exe
|
||||
0002AC6B: CC 66
|
||||
0002AC6C: CC 39
|
||||
0002AC6D: CC E8
|
||||
0002AC6E: CC EB
|
||||
0002AC6F: CC 53
|
||||
0002AC7B: CC E9
|
||||
0002AC7C: CC 96
|
||||
0002AC7D: CC A2
|
||||
0002AC7E: CC 00
|
||||
0002AC7F: CC 00
|
||||
0002ACC3: CC 75
|
||||
0002ACC4: CC 0A
|
||||
0002ACC5: CC 66
|
||||
0002ACC6: CC FF
|
||||
0002ACC7: CC 4C
|
||||
0002ACC8: CC 24
|
||||
0002ACC9: CC 16
|
||||
0002ACCA: CC 79
|
||||
0002ACCB: CC 03
|
||||
0002ACCC: CC 58
|
||||
0002ACCD: CC EB
|
||||
0002ACCE: CC AC
|
||||
0002ACCF: CC C3
|
||||
0002B2A1: CC 66
|
||||
0002B2A2: CC C7
|
||||
0002B2A3: CC 44
|
||||
0002B2A4: CC 24
|
||||
0002B2A5: CC 0E
|
||||
0002B2A6: CC 01
|
||||
0002B2A7: CC 00
|
||||
0002B2A8: CC 8B
|
||||
0002B2A9: CC 90
|
||||
0002B2AA: CC 44
|
||||
0002B2AB: CC 01
|
||||
0002B2AC: CC 00
|
||||
0002B2AD: CC 00
|
||||
0002B2AE: CC C3
|
||||
00034D91: 8B E8
|
||||
00034D92: 90 0B
|
||||
00034D93: 44 65
|
||||
00034D94: 01 FF
|
||||
00034D95: 00 FF
|
||||
00034D96: 00 90
|
||||
00034E53: 0F E8
|
||||
00034E54: 84 6B
|
||||
00034E55: BD 5E
|
||||
00034E56: 00 FF
|
||||
00034E57: 00 FF
|
||||
00034E58: 00 90
|
||||
00034EF3: 66 E8
|
||||
00034EF4: 3B 73
|
||||
00034EF5: C5 5D
|
||||
00034EF6: 74 FF
|
||||
00034EF7: 1E FF
|
@ -1,91 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=808
|
||||
|
||||
Original code:
|
||||
|
||||
.text:00916BCE mov edi, ebp
|
||||
.text:00916BD0 call eax
|
||||
.text:00916BD2 test eax, eax
|
||||
.text:00916BD4 jnz short loc_916C1C
|
||||
|
||||
.text:00916C0A mov edi, ebp
|
||||
|
||||
.text:00916C14 mov edi, ebp
|
||||
|
||||
Patch:
|
||||
|
||||
0x2ac34:
|
||||
CC CC CC CC CC CC CC CC CC CC CC CC
|
||||
8B 7C 24 78 8B 3C B7 FF D0 EB 25 CC
|
||||
|
||||
.text:0042B834 loc_42B834:
|
||||
.text:0042B834 mov edi, [esp+78h]
|
||||
.text:0042B838 mov edi, [edi+esi*4]
|
||||
.text:0042B83B call eax
|
||||
.text:0042B83D jmp short unk_42B864
|
||||
|
||||
0x2ac64
|
||||
CC CC CC CC CC CC CC CC CC CC CC CC
|
||||
85 C0 E9 69 B3 4E 00 CC CC CC CC CC
|
||||
|
||||
.text:0042B864 loc_42B864:
|
||||
.text:0042B864 test eax, eax
|
||||
.text:0042B866 jmp loc_916BD4
|
||||
|
||||
0x515fce
|
||||
8B FD FF D0 85 C0
|
||||
E9 61 4C B1 FF 90
|
||||
|
||||
.text:00916BCE jmp loc_42B834
|
||||
.text:00916BD3 nop
|
||||
.text:00916BD4 loc_916BD4:
|
||||
|
||||
0x51600a
|
||||
8B FD
|
||||
90 90
|
||||
|
||||
.text:00916C0A nop
|
||||
.text:00916C0B nop
|
||||
|
||||
0x516014
|
||||
8B FD
|
||||
90 90
|
||||
|
||||
.text:00916C14 nop
|
||||
.text:00916C15 nop
|
||||
|
||||
|
||||
You can use this script to apply the generated patch below:
|
||||
http://stalkr.net/files/ida/idadif.py
|
||||
|
||||
----8<----
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf Fortress.exe
|
||||
0002AC34: CC 8B
|
||||
0002AC35: CC 7C
|
||||
0002AC36: CC 24
|
||||
0002AC37: CC 78
|
||||
0002AC38: CC 8B
|
||||
0002AC39: CC 3C
|
||||
0002AC3A: CC B7
|
||||
0002AC3B: CC FF
|
||||
0002AC3C: CC D0
|
||||
0002AC3D: CC EB
|
||||
0002AC3E: CC 25
|
||||
0002AC64: CC 85
|
||||
0002AC65: CC C0
|
||||
0002AC66: CC E9
|
||||
0002AC67: CC 69
|
||||
0002AC68: CC B3
|
||||
0002AC69: CC 4E
|
||||
0002AC6A: CC 00
|
||||
00515FCE: 8B E9
|
||||
00515FCF: FD 61
|
||||
00515FD0: FF 4C
|
||||
00515FD1: D0 B1
|
||||
00515FD2: 85 FF
|
||||
00515FD3: C0 90
|
||||
0051600A: 8B 90
|
||||
0051600B: FD 90
|
||||
00516014: 8B 90
|
||||
00516015: FD 90
|
@ -1,61 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=5994
|
||||
|
||||
Original code:
|
||||
|
||||
.text:008629BD mov edi, [eax+38h]
|
||||
.text:008629C0 mov eax, [eax+3Ch]
|
||||
.text:008629C3 mov [esp+1Ch], eax
|
||||
.text:008629C7 cmp edi, eax
|
||||
.text:008629C9 jnb short loc_862A22
|
||||
.text:008629CB jmp short loc_8629D0
|
||||
.text:008629CD lea ecx, [ecx+0]
|
||||
...
|
||||
.text:00862A19 add edi, 4
|
||||
.text:00862A1C cmp edi, [esp+1Ch]
|
||||
.text:00862A20 jb short loc_8629D0
|
||||
|
||||
Patch:
|
||||
|
||||
0x461dbd
|
||||
8B 78 38 8B 40 3C 89 44 24 1C 3B F8
|
||||
8B 78 3C 8B 40 38 89 44 24 1C 39 F8
|
||||
|
||||
.text:008629BD mov edi, [eax+3Ch]
|
||||
.text:008629C0 mov eax, [eax+38h]
|
||||
.text:008629C3 mov [esp+1Ch], eax
|
||||
.text:008629C7 cmp eax, edi
|
||||
|
||||
0x461dcb
|
||||
EB 03 8D 49 00
|
||||
83 EF 04 90 90
|
||||
|
||||
.text:008629CB sub edi, 4
|
||||
.text:008629CE nop
|
||||
.text:008629CF nop
|
||||
|
||||
0x461e19
|
||||
83 C7 04 3B 7C 24 1C 72 AE
|
||||
83 EF 04 3B 7C 24 1C 73 AE
|
||||
|
||||
.text:00862A19 sub edi, 4
|
||||
.text:00862A1C cmp edi, [esp+1Ch]
|
||||
.text:00862A20 jnb short loc_8629D0
|
||||
|
||||
|
||||
You can use this script to apply the generated patch below:
|
||||
http://stalkr.net/files/ida/idadif.py
|
||||
|
||||
----8<----
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf_Fortress
|
||||
00461DBF: 38 3C
|
||||
00461DC2: 3C 38
|
||||
00461DC7: 3B 39
|
||||
00461DCB: EB 83
|
||||
00461DCC: 03 EF
|
||||
00461DCD: 8D 04
|
||||
00461DCE: 49 90
|
||||
00461DCF: 00 90
|
||||
00461E1A: C7 EF
|
||||
00461E20: 72 73
|
@ -1,104 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=5994
|
||||
|
||||
0x461de2
|
||||
F6 46 0C 01 74 31
|
||||
E9 0A 8E BC FF 90
|
||||
|
||||
.text:008629E2 jmp near ptr loc_42B7F1 ; << CAVE
|
||||
.text:008629E7 nop
|
||||
.text:008629E8 loc_8629E8:
|
||||
|
||||
0x2abf1
|
||||
CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
|
||||
8B 4C 24 2C F6 46 0C 01 75 08 E9 19 72 43 00
|
||||
|
||||
.text:0042B7F1 loc_42B7F1:
|
||||
.text:0042B7F1 mov ecx, [esp+2Ch] ; job
|
||||
.text:0042B7F5 test byte ptr [esi+0Ch], 1
|
||||
.text:0042B7F9 jnz short near ptr loc_42B803
|
||||
.text:0042B7FB coord_test_jfail:
|
||||
.text:0042B7FB jmp loc_862A19
|
||||
|
||||
0x2ac03
|
||||
CC CC CC CC CC CC CC CC CC CC CC CC CC
|
||||
8B 41 10 3B 46 04 75 F0 EB 06 CC CC CC
|
||||
|
||||
.text:0042B803 loc_42B803:
|
||||
.text:0042B803 mov eax, [ecx+10h] ; job->pos.(x,y)
|
||||
.text:0042B806 cmp eax, [esi+4] ; item->pos.(x,y)
|
||||
.text:0042B809 jnz short coord_test_jfail
|
||||
.text:0042B80B jmp short near ptr loc_42B813
|
||||
|
||||
0x2ac13
|
||||
CC CC CC CC CC CC CC CC CC CC CC CC CC
|
||||
66 8B 41 14 66 3B 46 08 75 DE EB 06 CC
|
||||
|
||||
text:0042B813 loc_42B813:
|
||||
.text:0042B813 mov ax, [ecx+14h] ; job->pos.z
|
||||
.text:0042B817 cmp ax, [esi+8] ; item->pos.z
|
||||
.text:0042B81B jnz short coord_test_jfail
|
||||
.text:0042B81D jmp short near ptr loc_42B825
|
||||
|
||||
0x2ac25
|
||||
CC CC CC CC CC CC CC CC CC CC CC
|
||||
E9 BE 71 43 00 CC CC CC CC CC CC
|
||||
|
||||
.text:0042B825 loc_42B825:
|
||||
.text:0042B825 jmp loc_8629E8
|
||||
|
||||
|
||||
You can use this script to apply the generated patch below:
|
||||
http://stalkr.net/files/ida/idadif.py
|
||||
|
||||
----8<----
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf Fortress.exe
|
||||
0002ABF1: CC 8B
|
||||
0002ABF2: CC 4C
|
||||
0002ABF3: CC 24
|
||||
0002ABF4: CC 2C
|
||||
0002ABF5: CC F6
|
||||
0002ABF6: CC 46
|
||||
0002ABF7: CC 0C
|
||||
0002ABF8: CC 01
|
||||
0002ABF9: CC 75
|
||||
0002ABFA: CC 08
|
||||
0002ABFB: CC E9
|
||||
0002ABFC: CC 19
|
||||
0002ABFD: CC 72
|
||||
0002ABFE: CC 43
|
||||
0002ABFF: CC 00
|
||||
0002AC03: CC 8B
|
||||
0002AC04: CC 41
|
||||
0002AC05: CC 10
|
||||
0002AC06: CC 3B
|
||||
0002AC07: CC 46
|
||||
0002AC08: CC 04
|
||||
0002AC09: CC 75
|
||||
0002AC0A: CC F0
|
||||
0002AC0B: CC EB
|
||||
0002AC0C: CC 06
|
||||
0002AC13: CC 66
|
||||
0002AC14: CC 8B
|
||||
0002AC15: CC 41
|
||||
0002AC16: CC 14
|
||||
0002AC17: CC 66
|
||||
0002AC18: CC 3B
|
||||
0002AC19: CC 46
|
||||
0002AC1A: CC 08
|
||||
0002AC1B: CC 75
|
||||
0002AC1C: CC DE
|
||||
0002AC1D: CC EB
|
||||
0002AC1E: CC 06
|
||||
0002AC25: CC E9
|
||||
0002AC26: CC BE
|
||||
0002AC27: CC 71
|
||||
0002AC28: CC 43
|
||||
0002AC29: CC 00
|
||||
00461DE2: F6 E9
|
||||
00461DE3: 46 0A
|
||||
00461DE4: 0C 8E
|
||||
00461DE5: 01 BC
|
||||
00461DE6: 74 FF
|
||||
00461DE7: 31 90
|
@ -1,62 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=4406
|
||||
|
||||
1. Include store in hospital jobs when recomputing counters
|
||||
|
||||
0x68a63
|
||||
0F 85 58 01 00 00
|
||||
90 90 90 90 90 90
|
||||
|
||||
<<<<
|
||||
.text:00469663 jnz loc_4697C1
|
||||
====
|
||||
.text:00469663 nop
|
||||
.text:00469664 nop
|
||||
.text:00469665 nop
|
||||
.text:00469666 nop
|
||||
.text:00469667 nop
|
||||
.text:00469668 nop
|
||||
>>>>
|
||||
|
||||
- if (job->getBuildingRef(BUILDING_DESTINATION) != this) continue;
|
||||
+ // NOP
|
||||
|
||||
This reference points to the containers, not the hospital civzone.
|
||||
Since fixing this properly is too hard for a patch, just remove the
|
||||
check. Most people have only one hospital anyway, and it is better
|
||||
to err on the side of caution here.
|
||||
|
||||
|
||||
2. Make the stockpiling code increment the right stock counters
|
||||
|
||||
0x3dcbf9
|
||||
8B 0C 90 8B 81 80 00 00 00
|
||||
8B 3C 90 8B 87 80 00 00 00
|
||||
|
||||
<<<<
|
||||
.text:007DD7F9 mov ecx, [eax+edx*4]
|
||||
.text:007DD7FC mov eax, [ecx+80h]
|
||||
====
|
||||
.text:007DD7F9 mov edi, [eax+edx*4]
|
||||
.text:007DD7FC mov eax, [edi+80h]
|
||||
>>>>
|
||||
|
||||
- id = civzones[i]->children[child_idx[i]]->id
|
||||
+ cur_civzone = civzones[i] // existing var from previous loop
|
||||
+ id = cur_civzone->children[child_idx[i]]->id
|
||||
|
||||
The reason being, later code uses that var (at this point containing
|
||||
useless data) to increment counters and amounts in the hospital.
|
||||
|
||||
|
||||
---8<---
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf Fortress.exe
|
||||
00068A63: 0F 90
|
||||
00068A64: 85 90
|
||||
00068A65: 58 90
|
||||
00068A66: 01 90
|
||||
00068A67: 00 90
|
||||
00068A68: 00 90
|
||||
003DCBFA: 0C 3C
|
||||
003DCBFD: 81 87
|
@ -1,83 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=4530
|
||||
|
||||
0x2ac85
|
||||
CC CC CC CC CC CC CC CC CC CC CC
|
||||
29 44 24 24 8B 9D 28 01 00 00 C3
|
||||
|
||||
.text:0042B885 loc_42B885:
|
||||
.text:0042B885 sub [esp+24h], eax
|
||||
.text:0042B889 mov ebx, [ebp+128h]
|
||||
.text:0042B88F retn
|
||||
|
||||
0x2ac94
|
||||
CC CC CC CC CC CC CC CC CC CC CC CC
|
||||
89 C1 8B 00 FF 90 34 02 00 00 EB E5
|
||||
|
||||
.text:0042B894 loc_42B894:
|
||||
.text:0042B894 mov ecx, eax
|
||||
.text:0042B896 mov eax, [eax]
|
||||
.text:0042B898 call dword ptr [eax+234h]
|
||||
.text:0042B89E jmp short loc_42B885
|
||||
|
||||
0x6e28ff
|
||||
29 44 24 20
|
||||
90 90 90 90
|
||||
|
||||
<<<<
|
||||
.text:00AE34FF sub [esp+20h], eax
|
||||
====
|
||||
.text:00AE34FF nop
|
||||
.text:00AE3500 nop
|
||||
.text:00AE3501 nop
|
||||
.text:00AE3502 nop
|
||||
>>>>
|
||||
|
||||
0x6e2999
|
||||
8B 9D 28 01 00 00
|
||||
E8 F6 82 94 FF 90
|
||||
|
||||
<<<<
|
||||
.text:00AE3599 mov ebx, [ebp+128h]
|
||||
====
|
||||
.text:00AE3599 call loc_42B894
|
||||
.text:00AE359E nop
|
||||
>>>>
|
||||
|
||||
---8<---
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf Fortress.exe
|
||||
0002AC85: CC 29
|
||||
0002AC86: CC 44
|
||||
0002AC87: CC 24
|
||||
0002AC88: CC 24
|
||||
0002AC89: CC 8B
|
||||
0002AC8A: CC 9D
|
||||
0002AC8B: CC 28
|
||||
0002AC8C: CC 01
|
||||
0002AC8D: CC 00
|
||||
0002AC8E: CC 00
|
||||
0002AC8F: CC C3
|
||||
0002AC94: CC 89
|
||||
0002AC95: CC C1
|
||||
0002AC96: CC 8B
|
||||
0002AC97: CC 00
|
||||
0002AC98: CC FF
|
||||
0002AC99: CC 90
|
||||
0002AC9A: CC 34
|
||||
0002AC9B: CC 02
|
||||
0002AC9C: CC 00
|
||||
0002AC9D: CC 00
|
||||
0002AC9E: CC EB
|
||||
0002AC9F: CC E5
|
||||
006E28FF: 29 90
|
||||
006E2900: 44 90
|
||||
006E2901: 24 90
|
||||
006E2902: 20 90
|
||||
006E2999: 8B E8
|
||||
006E299A: 9D F6
|
||||
006E299B: 28 82
|
||||
006E299C: 01 94
|
||||
006E299D: 00 FF
|
||||
006E299E: 00 90
|
||||
|
@ -1,61 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=1445
|
||||
|
||||
0x4c05c4
|
||||
8B 8C 24 80 00 00 00
|
||||
89 C1 90 90 90 90 90
|
||||
|
||||
<<<<
|
||||
.text:008C11C4 mov ecx, [esp+98h+var_18]
|
||||
====
|
||||
.text:008C11C4 mov ecx, eax
|
||||
.text:008C11C6 nop
|
||||
.text:008C11C7 nop
|
||||
.text:008C11C8 nop
|
||||
.text:008C11C9 nop
|
||||
.text:008C11CA nop
|
||||
>>>>
|
||||
|
||||
0x4c06a1
|
||||
8B 8C 24 80 00 00 00
|
||||
89 C1 90 90 90 90 90
|
||||
|
||||
<<<<
|
||||
.text:008C12A1 mov ecx, [esp+98h+var_18]
|
||||
====
|
||||
.text:008C12A1 mov ecx, eax
|
||||
.text:008C12A3 nop
|
||||
.text:008C12A4 nop
|
||||
.text:008C12A5 nop
|
||||
.text:008C12A6 nop
|
||||
.text:008C12A7 nop
|
||||
>>>>
|
||||
|
||||
|
||||
basically:
|
||||
|
||||
b_squad_id = building->getSpecificSquad();
|
||||
- if (b_squad_id != squad->id || !building->canUse(some_squad_id, 4))
|
||||
+ if (b_squad_id != squad->id || !building->canUse(b_squad_id, 4))
|
||||
unassign(building);
|
||||
|
||||
the reason being, some_other_squad_id contains irrelevant garbage at this point
|
||||
|
||||
|
||||
---8<---
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf Fortress.exe
|
||||
004C05C4: 8B 89
|
||||
004C05C5: 8C C1
|
||||
004C05C6: 24 90
|
||||
004C05C7: 80 90
|
||||
004C05C8: 00 90
|
||||
004C05C9: 00 90
|
||||
004C05CA: 00 90
|
||||
004C06A1: 8B 89
|
||||
004C06A2: 8C C1
|
||||
004C06A3: 24 90
|
||||
004C06A4: 80 90
|
||||
004C06A5: 00 90
|
||||
004C06A6: 00 90
|
||||
004C06A7: 00 90
|
@ -1,147 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=1445
|
||||
|
||||
0x9461
|
||||
90 90 90 90 90 90 90 90 90 90 90 90 90 90
|
||||
C7 44 24 18 01 00 00 00 FF A0 44 01 00 00
|
||||
|
||||
.text:08051461 sub_8051461 proc near
|
||||
.text:08051461 mov dword ptr [esp+18h], 1
|
||||
.text:08051469 jmp dword ptr [eax+144h]
|
||||
.text:08051469 sub_8051461 endp
|
||||
|
||||
0x9548
|
||||
90 90 90 90 90 90 90 90
|
||||
FF 4C 24 14 78 08 EB 0B
|
||||
|
||||
.text:08051548 loc_8051548:
|
||||
.text:08051548 dec dword ptr [esp+14h]
|
||||
.text:0805154C js short loc_8051556
|
||||
.text:0805154E jmp short loc_805155B
|
||||
|
||||
0x9556
|
||||
90 90 90 90 90 90 90 90 90 90
|
||||
E9 F6 8C 05 00 E9 D0 8D 05 00
|
||||
|
||||
.text:08051556 loc_8051556:
|
||||
.text:08051556 jmp loc_80AA251
|
||||
.text:0805155B loc_805155B:
|
||||
.text:0805155B jmp loc_80AA330
|
||||
|
||||
0x9568
|
||||
90 90 90 90 90 90 90 90
|
||||
FF 4C 24 14 78 E8 EB 06
|
||||
|
||||
.text:08051568 loc_8051568:
|
||||
.text:08051568 dec [esp+14h]
|
||||
.text:0805156C js short loc_8051556
|
||||
.text:0805156E jmp short loc_8051576
|
||||
|
||||
0x9576
|
||||
90 90 90 90 90
|
||||
E9 4D 8E 05 00
|
||||
|
||||
.text:08051576 loc_8051576:
|
||||
.text:08051576 jmp loc_80AA3C8
|
||||
|
||||
0x62243
|
||||
FF 90 44 01 00 00
|
||||
E8 19 72 FA FF 90
|
||||
|
||||
<<<<
|
||||
.text:080AA243 call dword ptr [eax+144h]
|
||||
====
|
||||
.text:080AA243 call sub_8051461
|
||||
.text:080AA248 nop
|
||||
>>>>
|
||||
|
||||
0x62369
|
||||
E9 E3 FE FF FF
|
||||
E9 DA 71 FA FF
|
||||
|
||||
<<<<
|
||||
.text:080AA369 jmp loc_80AA251
|
||||
====
|
||||
.text:080AA369 jmp loc_8051548
|
||||
>>>>
|
||||
|
||||
0x623f6
|
||||
E9 56 FE FF FF
|
||||
E9 6D 71 FA FF
|
||||
|
||||
<<<<
|
||||
.text:080AA3F6 jmp loc_80AA251
|
||||
====
|
||||
.text:080AA3F6 jmp loc_8051568
|
||||
>>>>
|
||||
|
||||
basically:
|
||||
|
||||
+ int allowed_count = 1; // to mean 2
|
||||
...
|
||||
- if (type(item) == new_type)
|
||||
+ if (type(item) == new_type && --allowed_count < 0)
|
||||
return false;
|
||||
|
||||
to allow up to two items of the same type at the same time
|
||||
|
||||
---8<---
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf_Fortress
|
||||
00009461: 90 C7
|
||||
00009462: 90 44
|
||||
00009463: 90 24
|
||||
00009464: 90 18
|
||||
00009465: 90 01
|
||||
00009466: 90 00
|
||||
00009467: 90 00
|
||||
00009468: 90 00
|
||||
00009469: 90 FF
|
||||
0000946A: 90 A0
|
||||
0000946B: 90 44
|
||||
0000946C: 90 01
|
||||
0000946D: 90 00
|
||||
0000946E: 90 00
|
||||
00009548: 90 FF
|
||||
00009549: 90 4C
|
||||
0000954A: 90 24
|
||||
0000954B: 90 14
|
||||
0000954C: 90 78
|
||||
0000954D: 90 08
|
||||
0000954E: 90 EB
|
||||
0000954F: 90 0B
|
||||
00009556: 90 E9
|
||||
00009557: 90 F6
|
||||
00009558: 90 8C
|
||||
00009559: 90 05
|
||||
0000955A: 90 00
|
||||
0000955B: 90 E9
|
||||
0000955C: 90 D0
|
||||
0000955D: 90 8D
|
||||
0000955E: 90 05
|
||||
0000955F: 90 00
|
||||
00009568: 90 FF
|
||||
00009569: 90 4C
|
||||
0000956A: 90 24
|
||||
0000956B: 90 14
|
||||
0000956C: 90 78
|
||||
0000956D: 90 E8
|
||||
0000956E: 90 EB
|
||||
0000956F: 90 06
|
||||
00009576: 90 E9
|
||||
00009577: 90 4D
|
||||
00009578: 90 8E
|
||||
00009579: 90 05
|
||||
0000957A: 90 00
|
||||
00062243: FF E8
|
||||
00062244: 90 19
|
||||
00062245: 44 72
|
||||
00062246: 01 FA
|
||||
00062247: 00 FF
|
||||
00062248: 00 90
|
||||
0006236A: E3 DA
|
||||
0006236B: FE 71
|
||||
0006236C: FF FA
|
||||
000623F7: 56 6D
|
||||
000623F8: FE 71
|
||||
000623F9: FF FA
|
@ -1,40 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=808
|
||||
|
||||
for (i = 0; i < num_items; i++)
|
||||
{
|
||||
ridx = reagent_idx[i];
|
||||
sz = reagent_quantity[ridx]; // used quantity
|
||||
if (sz <= 0) continue;
|
||||
reag = reagent[ridx];
|
||||
if (reag->flags.PRESERVE_REAGENT) continue;
|
||||
rsz = items[i]->getTotalDimension();
|
||||
<<<<<<<<
|
||||
if (reag->flags3.ANY_RAW_MATERIAL)
|
||||
rsz *= BASE_SIZE(items[i]->getType());
|
||||
if (items[i]->subtractDimension(rsz))
|
||||
========
|
||||
/* Not in patch, but necessary for full correctness:
|
||||
if (reag->flags3.ANY_RAW_MATERIAL)
|
||||
rsz /= BASE_SIZE(items[i]->getType());
|
||||
*/
|
||||
if (reag->flags3.ANY_RAW_MATERIAL)
|
||||
sz *= BASE_SIZE(items[i]->getType());
|
||||
if (items[i]->subtractDimension(sz))
|
||||
>>>>>>>>
|
||||
destroy_item(items[i]);
|
||||
reagent_quantity[ridx] -= rsz
|
||||
if (reagent_quantity[ridx] < 0)
|
||||
reagent_quantity[ridx] = 0;
|
||||
}
|
||||
|
||||
You can use this script to apply the generated patch below:
|
||||
http://stalkr.net/files/ida/idadif.py
|
||||
|
||||
----8<----
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf_Fortress
|
||||
0087F7EF: F8 D8
|
||||
0087F86F: F8 D8
|
||||
0087F9AD: C7 C3
|
||||
0087F9ED: C7 C3
|
@ -1,83 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=5994
|
||||
|
||||
Original code:
|
||||
|
||||
.text:087AC378 cmp edx, eax
|
||||
.text:087AC37A mov [esp+4Ch], eax
|
||||
.text:087AC37E jnb loc_87A7034
|
||||
.text:087AC384 mov [esp+48h], edx
|
||||
.text:087AC388 mov [esp+54h], ebx
|
||||
...
|
||||
.text:087AC440 add dword ptr [esp+48h], 4
|
||||
.text:087AC445 mov ebp, [esp+48h]
|
||||
.text:087AC449 cmp [esp+4Ch], ebp
|
||||
.text:087AC44D ja loc_87AC38C
|
||||
|
||||
Patch:
|
||||
|
||||
0x76437a
|
||||
89 44 24 4C
|
||||
89 54 24 4C
|
||||
|
||||
.text:087AC37A mov [esp+4Ch], edx
|
||||
|
||||
0x764384
|
||||
89 54 24 48 89 5C 24 54
|
||||
E8 8A 51 8A FF 90 90 90
|
||||
|
||||
.text:087AC384 call sub_8051513
|
||||
.text:087AC389 nop
|
||||
.text:087AC38A nop
|
||||
.text:087AC38B nop
|
||||
|
||||
0x764440
|
||||
83 44 24 48 04 8B 6C 24 48 39 6C 24 4C 0F 87 39 FF FF FF
|
||||
83 6C 24 48 04 8B 6C 24 48 39 6C 24 4C 0F 86 39 FF FF FF
|
||||
|
||||
.text:087AC440 sub dword ptr [esp+48h], 4
|
||||
.text:087AC445 mov ebp, [esp+48h]
|
||||
.text:087AC449 cmp [esp+4Ch], ebp
|
||||
.text:087AC44D jbe loc_87AC38C
|
||||
|
||||
0x9513
|
||||
90 90 90 90 90 90 90 90 90 90 90 90 90
|
||||
83 E8 04 89 44 24 4C 89 5C 24 58 C3 90
|
||||
|
||||
.text:08051513 sub_8051513 proc near
|
||||
.text:08051513 sub eax, 4
|
||||
.text:08051516 mov [esp+4Ch], eax ; 48h
|
||||
.text:0805151A mov [esp+58h], ebx ; 54h
|
||||
.text:0805151E retn
|
||||
.text:0805151E sub_8051513 endp
|
||||
|
||||
|
||||
You can use this script to apply the generated patch below:
|
||||
http://stalkr.net/files/ida/idadif.py
|
||||
|
||||
----8<----
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf_Fortress
|
||||
00009513: 90 83
|
||||
00009514: 90 E8
|
||||
00009515: 90 04
|
||||
00009516: 90 89
|
||||
00009517: 90 44
|
||||
00009518: 90 24
|
||||
00009519: 90 4C
|
||||
0000951A: 90 89
|
||||
0000951B: 90 5C
|
||||
0000951C: 90 24
|
||||
0000951D: 90 58
|
||||
0000951E: 90 C3
|
||||
0076437B: 44 54
|
||||
00764384: 89 E8
|
||||
00764385: 54 8A
|
||||
00764386: 24 51
|
||||
00764387: 48 8A
|
||||
00764388: 89 FF
|
||||
00764389: 5C 90
|
||||
0076438A: 24 90
|
||||
0076438B: 54 90
|
||||
00764441: 44 6C
|
||||
0076444E: 87 86
|
@ -1,139 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=5994
|
||||
|
||||
0x7643f8
|
||||
F6 46 0C 01 74 42
|
||||
E9 B6 50 8A FF 90
|
||||
|
||||
.text:087AC3F8 jmp loc_80514B3 ; << CAVE
|
||||
.text:087AC3FD nop
|
||||
.text:087AC3FE loc_87AC3FE:
|
||||
|
||||
0x94b3
|
||||
90 90 90 90 90 90 90 90 90 90 90 90 90
|
||||
F6 46 0C 01 75 0A E9 82 AF 75 00 90 90
|
||||
|
||||
.text:080514B3 loc_80514B3:
|
||||
.text:080514B3 test byte ptr [esi+0Ch], 1
|
||||
.text:080514B7 jnz short loc_80514C3
|
||||
.text:080514B9 coord_test_jfail:
|
||||
.text:080514B9 jmp loc_87AC440
|
||||
|
||||
0x94c3
|
||||
90 90 90 90 90 90 90 90 90 90 90 90 90
|
||||
8D 9C 24 60 03 00 00 0F BF 03 EB 07 90
|
||||
|
||||
.text:080514C3 loc_80514C3:
|
||||
.text:080514C3 lea ebx, [esp+360h]
|
||||
.text:080514CA movsx eax, word ptr [ebx] ; job_z
|
||||
.text:080514CD jmp short loc_80514D6
|
||||
|
||||
0x94d6
|
||||
90 90 90 90 90 90 90 90 90 90
|
||||
66 3B 46 08 75 DD EB 05 90 90
|
||||
|
||||
.text:080514D6 loc_80514D6:
|
||||
.text:080514D6 cmp ax, [esi+8] ; item->pos.z
|
||||
.text:080514DA jnz short coord_test_jfail
|
||||
.text:080514DC jmp short loc_80514E3
|
||||
|
||||
0x94e3
|
||||
90 90 90 90 90 90 90 90 90 90 90 90 90
|
||||
0F BF 43 10 66 3B 46 04 75 CC EB 04 90
|
||||
|
||||
.text:080514E3 loc_80514E3:
|
||||
.text:080514E3 movsx eax, word ptr [ebx+10h] ; job_x
|
||||
.text:080514E7 cmp ax, [esi+4] ; item->pos.x
|
||||
.text:080514EB jnz short coord_test_jfail
|
||||
.text:080514ED jmp short loc_80514F3
|
||||
|
||||
0x94f3
|
||||
90 90 90 90 90 90 90 90 90 90 90 90 90
|
||||
0F BF 43 20 66 3B 46 06 75 BC EB 04 90
|
||||
|
||||
.text:080514F3 loc_80514F3:
|
||||
.text:080514F3 movsx eax, word ptr [ebx+20h] ; job_y
|
||||
.text:080514F7 cmp ax, [esi+6] ; item->pos.y
|
||||
.text:080514FB jnz short coord_test_jfail
|
||||
.text:080514FD jmp short loc_8051503
|
||||
|
||||
0x9503
|
||||
90 90 90 90 90 90 90 90 90 90 90 90 90
|
||||
E9 F6 AE 75 00 90 90 90 90 90 90 90 90
|
||||
|
||||
.text:08051503 loc_8051503:
|
||||
.text:08051503 jmp loc_87AC3FE
|
||||
|
||||
|
||||
You can use this script to apply the generated patch below:
|
||||
http://stalkr.net/files/ida/idadif.py
|
||||
|
||||
----8<----
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf_Fortress
|
||||
000094B3: 90 F6
|
||||
000094B4: 90 46
|
||||
000094B5: 90 0C
|
||||
000094B6: 90 01
|
||||
000094B7: 90 75
|
||||
000094B8: 90 0A
|
||||
000094B9: 90 E9
|
||||
000094BA: 90 82
|
||||
000094BB: 90 AF
|
||||
000094BC: 90 75
|
||||
000094BD: 90 00
|
||||
000094C3: 90 8D
|
||||
000094C4: 90 9C
|
||||
000094C5: 90 24
|
||||
000094C6: 90 60
|
||||
000094C7: 90 03
|
||||
000094C8: 90 00
|
||||
000094C9: 90 00
|
||||
000094CA: 90 0F
|
||||
000094CB: 90 BF
|
||||
000094CC: 90 03
|
||||
000094CD: 90 EB
|
||||
000094CE: 90 07
|
||||
000094D6: 90 66
|
||||
000094D7: 90 3B
|
||||
000094D8: 90 46
|
||||
000094D9: 90 08
|
||||
000094DA: 90 75
|
||||
000094DB: 90 DD
|
||||
000094DC: 90 EB
|
||||
000094DD: 90 05
|
||||
000094E3: 90 0F
|
||||
000094E4: 90 BF
|
||||
000094E5: 90 43
|
||||
000094E6: 90 10
|
||||
000094E7: 90 66
|
||||
000094E8: 90 3B
|
||||
000094E9: 90 46
|
||||
000094EA: 90 04
|
||||
000094EB: 90 75
|
||||
000094EC: 90 CC
|
||||
000094ED: 90 EB
|
||||
000094EE: 90 04
|
||||
000094F3: 90 0F
|
||||
000094F4: 90 BF
|
||||
000094F5: 90 43
|
||||
000094F6: 90 20
|
||||
000094F7: 90 66
|
||||
000094F8: 90 3B
|
||||
000094F9: 90 46
|
||||
000094FA: 90 06
|
||||
000094FB: 90 75
|
||||
000094FC: 90 BC
|
||||
000094FD: 90 EB
|
||||
000094FE: 90 04
|
||||
00009503: 90 E9
|
||||
00009504: 90 F6
|
||||
00009505: 90 AE
|
||||
00009506: 90 75
|
||||
00009507: 90 00
|
||||
007643F8: F6 E9
|
||||
007643F9: 46 B6
|
||||
007643FA: 0C 50
|
||||
007643FB: 01 8A
|
||||
007643FC: 74 FF
|
||||
007643FD: 42 90
|
@ -1,60 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=4406
|
||||
|
||||
1. Include store in hospital jobs when recomputing counters
|
||||
|
||||
0x746d7
|
||||
75 D7
|
||||
90 90
|
||||
|
||||
<<<<
|
||||
.text:080BC6D7 jnz short loc_80BC6B0
|
||||
====
|
||||
.text:080BC6D7 nop
|
||||
.text:080BC6D8 nop
|
||||
>>>>
|
||||
|
||||
- if (job->getBuildingRef(BUILDING_DESTINATION) != this) continue;
|
||||
+ // NOP
|
||||
|
||||
This reference points to the containers, not the hospital civzone.
|
||||
Since fixing this properly is too hard for a patch, just remove the
|
||||
check. Most people have only one hospital anyway, and it is better
|
||||
to err on the side of caution here.
|
||||
|
||||
|
||||
2. Make the stockpiling code increment the right stock counters
|
||||
|
||||
0x67cb0e
|
||||
0B 04 90
|
||||
8B 1C 90
|
||||
|
||||
0x67cb18
|
||||
8B 40 74
|
||||
8B 43 74
|
||||
|
||||
<<<<
|
||||
.text:086C4B0E mov eax, [eax+edx*4]
|
||||
.text:086C4B11 mov edx, [esp+ecx*4+39Ch+var_2B4]
|
||||
.text:086C4B18 mov eax, [eax+74h]
|
||||
====
|
||||
.text:086C4B0E mov ebx, [eax+edx*4]
|
||||
.text:086C4B11 mov edx, [esp+ecx*4+39Ch+var_2B4]
|
||||
.text:086C4B18 mov eax, [ebx+74h]
|
||||
>>>>
|
||||
|
||||
- id = civzones[i]->children[child_idx[i]]->id
|
||||
+ cur_civzone = civzones[i] // existing var from previous loop
|
||||
+ id = cur_civzone->children[child_idx[i]]->id
|
||||
|
||||
The reason being, later code uses that var (at this point containing
|
||||
useless data) to increment counters and amounts in the hospital.
|
||||
|
||||
|
||||
---8<---
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf_Fortress
|
||||
000746D7: 75 90
|
||||
000746D8: D7 90
|
||||
0067CB0F: 04 1C
|
||||
0067CB19: 40 43
|
@ -1,85 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=4530
|
||||
|
||||
0x9508
|
||||
|
||||
90 90 90 90 90 90 90 90
|
||||
E9 13 76 9C 00 90 90 90
|
||||
|
||||
.text:08051508 loc_8051508:
|
||||
.text:08051508 jmp sub_8A18B20
|
||||
|
||||
0x9523
|
||||
|
||||
90 90 90 90 90 90 90 90 90 90 90 90 90
|
||||
50 8B 03 53 FF 90 34 02 00 00 EB 09 90
|
||||
|
||||
.text:08051523 sub_8051523:
|
||||
.text:08051523 push eax
|
||||
.text:08051524 mov eax, [ebx]
|
||||
.text:08051526 push ebx
|
||||
.text:08051527 call dword ptr [eax+234h]
|
||||
.text:0805152D jmp short loc_8051538
|
||||
|
||||
0x9538
|
||||
|
||||
90 90 90 90 90 90 90 90
|
||||
29 44 24 64 5B 58 EB C8
|
||||
|
||||
.text:08051538 loc_8051538:
|
||||
.text:08051538 sub [esp+64h], eax
|
||||
.text:0805153C pop ebx
|
||||
.text:0805153D pop eax
|
||||
.text:0805153E jmp short loc_8051508
|
||||
|
||||
0xa5cdd0
|
||||
|
||||
29 44 24 58
|
||||
90 90 90 90
|
||||
|
||||
.text:08AA4DD0 nop
|
||||
.text:08AA4DD1 nop
|
||||
.text:08AA4DD2 nop
|
||||
.text:08AA4DD3 nop
|
||||
|
||||
0xa5e2c3
|
||||
|
||||
E8 58 28 F7 FF
|
||||
E8 5B B2 5A FF
|
||||
|
||||
.text:08AA62C3 call sub_8051523
|
||||
|
||||
---8<---
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf_Fortress
|
||||
00009508: 90 E9
|
||||
00009509: 90 13
|
||||
0000950A: 90 76
|
||||
0000950B: 90 9C
|
||||
0000950C: 90 00
|
||||
00009523: 90 50
|
||||
00009524: 90 8B
|
||||
00009525: 90 03
|
||||
00009526: 90 53
|
||||
00009527: 90 FF
|
||||
00009529: 90 34
|
||||
0000952A: 90 02
|
||||
0000952B: 90 00
|
||||
0000952C: 90 00
|
||||
0000952D: 90 EB
|
||||
0000952E: 90 09
|
||||
00009538: 90 29
|
||||
00009539: 90 44
|
||||
0000953A: 90 24
|
||||
0000953B: 90 64
|
||||
0000953C: 90 5B
|
||||
0000953D: 90 58
|
||||
0000953E: 90 EB
|
||||
0000953F: 90 C8
|
||||
00A5CDD0: 29 90
|
||||
00A5CDD1: 44 90
|
||||
00A5CDD2: 24 90
|
||||
00A5CDD3: 58 90
|
||||
00A5E2C4: 58 5B
|
||||
00A5E2C5: 28 B2
|
||||
00A5E2C6: F7 5A
|
@ -1,45 +0,0 @@
|
||||
http://www.bay12games.com/dwarves/mantisbt/view.php?id=1445
|
||||
|
||||
Fix use of uninitialized variables to stop auto-unassigning racks:
|
||||
|
||||
0x7ee948
|
||||
8B 7C 24 3C
|
||||
89 C7 90 90
|
||||
|
||||
.text:08836948 mov edi, eax
|
||||
.text:0883694A nop
|
||||
.text:0883694B nop
|
||||
|
||||
|
||||
0x7eea2f
|
||||
8B 7C 24 3C
|
||||
89 C7 90 90
|
||||
|
||||
.text:08836A2F mov edi, eax
|
||||
.text:08836A31 nop
|
||||
.text:08836A32 nop
|
||||
|
||||
|
||||
basically:
|
||||
|
||||
b_squad_id = building->getSpecificSquad();
|
||||
- if (b_squad_id != squad->id || !building->canUse(some_squad_id, 4))
|
||||
+ if (b_squad_id != squad->id || !building->canUse(b_squad_id, 4))
|
||||
unassign(building);
|
||||
|
||||
the reason being, some_other_squad_id contains irrelevant garbage at this point
|
||||
|
||||
|
||||
---8<---
|
||||
This difference file is created by The Interactive Disassembler
|
||||
|
||||
Dwarf_Fortress
|
||||
007EE948: 8B 89
|
||||
007EE949: 7C C7
|
||||
007EE94A: 24 90
|
||||
007EE94B: 3C 90
|
||||
007EEA2F: 8B 89
|
||||
007EEA30: 7C C7
|
||||
007EEA31: 24 90
|
||||
007EEA32: 3C 90
|
||||
|
@ -1,20 +0,0 @@
|
||||
see linux patch for info
|
||||
|
||||
- .text:00111776 jnz loc_111750
|
||||
+ .text:00111776 nop
|
||||
+ .text:00111777 nop
|
||||
|
||||
sub_660360
|
||||
osx stores pointer in edi instead of ebx
|
||||
- .text:006612C3 mov eax, [eax+edx*4]
|
||||
+ .text:006612C3 mov edi, [eax+edx*4]
|
||||
- .text:006612CD mov eax, [eax+74h]
|
||||
+ .text:006612CD mov eax, [edi+74h]
|
||||
|
||||
---8<---
|
||||
|
||||
Dwarf_Fortress
|
||||
00110776: 75 90
|
||||
00110777: D8 90
|
||||
006602C4: 04 3C
|
||||
006602CE: 40 47
|
@ -1,88 +0,0 @@
|
||||
-- Fixes cloth/thread stockpiles by correcting material object data.
|
||||
|
||||
local raws = df.global.world.raws
|
||||
|
||||
-- Cache references to vectors in lua tables for a speed-up
|
||||
local organic_types = {}
|
||||
for i,v in ipairs(raws.mat_table.organic_types) do
|
||||
organic_types[i] = v
|
||||
end
|
||||
local organic_indexes = {}
|
||||
for i,v in ipairs(raws.mat_table.organic_indexes) do
|
||||
organic_indexes[i] = v
|
||||
end
|
||||
|
||||
local function verify(category,idx,vtype,vidx)
|
||||
if idx == -1 then
|
||||
-- Purely for reporting reasons
|
||||
return true
|
||||
end
|
||||
local tvec = organic_types[category]
|
||||
if idx < 0 or idx >= #tvec or tvec[idx] ~= vtype then
|
||||
return false
|
||||
end
|
||||
return organic_indexes[category][idx] == vidx
|
||||
end
|
||||
|
||||
local patched_cnt = 0
|
||||
local mat_cnt = 0
|
||||
|
||||
function patch_material(mat,mat_type,mat_index)
|
||||
local idxarr = mat.food_mat_index
|
||||
|
||||
-- These refer to fish/eggs, i.e. castes and not materials
|
||||
idxarr[1] = -1
|
||||
idxarr[2] = -1
|
||||
idxarr[3] = -1
|
||||
|
||||
for i = 0,#idxarr-1 do
|
||||
if not verify(i,idxarr[i],mat_type,mat_index) then
|
||||
idxarr[i] = -1
|
||||
patched_cnt = patched_cnt+1
|
||||
end
|
||||
end
|
||||
|
||||
mat_cnt = mat_cnt + 1
|
||||
end
|
||||
|
||||
function patch_materials()
|
||||
patched_cnt = 0
|
||||
mat_cnt = 0
|
||||
|
||||
print('Fixing cloth stockpile handling (bug 5739)...')
|
||||
|
||||
for i,v in ipairs(raws.inorganics) do
|
||||
patch_material(v.material, 0, i)
|
||||
end
|
||||
|
||||
for i,v in ipairs(raws.creatures.all) do
|
||||
for j,m in ipairs(v.material) do
|
||||
patch_material(m, 19+j, i)
|
||||
end
|
||||
end
|
||||
|
||||
for i,v in ipairs(raws.plants.all) do
|
||||
for j,m in ipairs(v.material) do
|
||||
patch_material(m, 419+j, i)
|
||||
end
|
||||
end
|
||||
|
||||
print('Patched '..patched_cnt..' bad references in '..mat_cnt..' materials.')
|
||||
end
|
||||
|
||||
local args = {...}
|
||||
|
||||
if args[1] == 'enable' then
|
||||
dfhack.onStateChange[_ENV] = function(sc)
|
||||
if sc == SC_WORLD_LOADED then
|
||||
patch_materials()
|
||||
end
|
||||
end
|
||||
if dfhack.isWorldLoaded() then
|
||||
patch_materials()
|
||||
end
|
||||
elseif args[1] == 'disable' then
|
||||
dfhack.onStateChange[_ENV] = nil
|
||||
else
|
||||
patch_materials()
|
||||
end
|
@ -1,35 +0,0 @@
|
||||
--growth-bug.lua: units only grow when the current tick is 0 mod 10, so only 1/10 units will grow naturally. this script periodically sets the birth time of each unit so that it will grow
|
||||
--to run periodically, use "repeat -time 2 months -command fix/growth-bug -now". see repeat.lua for details
|
||||
--author expwnent
|
||||
|
||||
local utils = require 'utils'
|
||||
|
||||
validArgs = validArgs or utils.invert({
|
||||
'help',
|
||||
'now'
|
||||
})
|
||||
|
||||
local args = utils.processArgs({...}, validArgs)
|
||||
|
||||
if args.help or not next(args) then
|
||||
print("fix/growth-bug usage")
|
||||
print(" fix/growth-bug")
|
||||
print(" fix the growth bug for all units on the map")
|
||||
print(" fix/growth-bug -help")
|
||||
print(" print this help message")
|
||||
print(" repeat -time [n] [years/months/ticks/days/etc] -command fix/growth-bug now")
|
||||
print(" run this script every n time units")
|
||||
print(" repeat -cancel fix/growth-bug")
|
||||
print(" stop automatically running this script")
|
||||
end
|
||||
|
||||
local count = 0
|
||||
for _,unit in ipairs(df.global.world.units.all) do
|
||||
local offset = unit.relations.birth_time % 10;
|
||||
if offset ~= 0 then
|
||||
unit.relations.birth_time = unit.relations.birth_time - offset
|
||||
count = count+1
|
||||
end
|
||||
end
|
||||
print("Fixed growth bug for "..count.." units.")
|
||||
|
Loading…
Reference in New Issue