summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Misc.cpp23
-rw-r--r--src/Misc.h2
-rw-r--r--src/graphics/Renderer.cpp10
-rw-r--r--src/gui/game/GameController.cpp47
-rw-r--r--src/gui/game/GameController.h1
-rw-r--r--src/gui/game/SignTool.cpp10
-rw-r--r--src/simulation/Sign.cpp45
7 files changed, 95 insertions, 43 deletions
diff --git a/src/Misc.cpp b/src/Misc.cpp
index 918e5c4..39db54b 100644
--- a/src/Misc.cpp
+++ b/src/Misc.cpp
@@ -622,21 +622,34 @@ void membwand(void * destv, void * srcv, size_t destsize, size_t srcsize)
}
}
-int splitsign(const char* str)
+int splitsign(const char* str, char * type)
{
int match=0,r;
- if (str[0]=='{' && (str[1]=='c' || str[1]=='t') && str[2]==':' && str[3]>='0' && str[3]<='9')
+ if (str[0]=='{' && (str[1]=='c' || str[1]=='t' || str[1]=='b'))
{
- const char* p=str+4;
- while (*p>='0' && *p<='9')
- p++;
+ const char* p=str+2;
+ if(str[1] != 'b') {
+ if(str[2]==':' && str[3]>='0' && str[3]<='9')
+ {
+ p=str+4;
+ while (*p>='0' && *p<='9')
+ p++;
+ }
+ else
+ return 0;
+ }
+
if (*p=='|')
{
r=p-str;
while (*p)
p++;
if (p[-1]=='}')
+ {
+ if(type)
+ *type = str[1];
return r;
+ }
}
}
return 0;
diff --git a/src/Misc.h b/src/Misc.h
index 0f73950..ef9ef8b 100644
--- a/src/Misc.h
+++ b/src/Misc.h
@@ -86,7 +86,7 @@ void OpenURI(std::string uri);
void membwand(void * dest, void * src, size_t destsize, size_t srcsize);
-int splitsign(const char* str);
+int splitsign(const char* str, char * type = NULL);
// a b
// c d
diff --git a/src/graphics/Renderer.cpp b/src/graphics/Renderer.cpp
index 45bc15e..9c99bfa 100644
--- a/src/graphics/Renderer.cpp
+++ b/src/graphics/Renderer.cpp
@@ -923,14 +923,18 @@ void Renderer::DrawSigns()
for (i=0; i < signs.size(); i++)
if (signs[i].text.length())
{
+ char type = 0;
std::string text = signs[i].getText(sim);
+ splitsign(signs[i].text.c_str(), &type);
signs[i].pos(text, x, y, w, h);
clearrect(x, y, w+1, h);
drawrect(x, y, w+1, h, 192, 192, 192, 255);
- if (splitsign(signs[i].text.c_str()))
- drawtext(x+3, y+3, text, 0, 191, 255, 255);
- else
+ if (!type)
drawtext(x+3, y+3, text, 255, 255, 255, 255);
+ else if(type == 'b')
+ drawtext(x+3, y+3, text, 211, 211, 40, 255);
+ else
+ drawtext(x+3, y+3, text, 0, 191, 255, 255);
x = signs[i].x;
y = signs[i].y;
diff --git a/src/gui/game/GameController.cpp b/src/gui/game/GameController.cpp
index a114b82..cfcb5e6 100644
--- a/src/gui/game/GameController.cpp
+++ b/src/gui/game/GameController.cpp
@@ -253,6 +253,18 @@ GameView * GameController::GetView()
return gameView;
}
+sign * GameController::GetSignAt(int x, int y){
+ Simulation * sim = gameModel->GetSimulation();
+ for (std::vector<sign>::iterator iter = sim->signs.begin(), end = sim->signs.end(); iter != end; ++iter)
+ {
+ int signx, signy, signw, signh;
+ (*iter).pos((*iter).getText(sim), signx, signy, signw, signh);
+ if (x>=signx && x<=signx+signw && y>=signy && y<=signy+signh)
+ return &(*iter);
+ }
+ return NULL;
+}
+
void GameController::PlaceSave(ui::Point position)
{
if(gameModel->GetPlaceSave())
@@ -550,7 +562,18 @@ bool GameController::BrushChanged(int brushType, int rx, int ry)
bool GameController::MouseDown(int x, int y, unsigned button)
{
- return commandInterface->OnMouseDown(x, y, button);
+ bool ret = commandInterface->OnMouseDown(x, y, button);
+ ui::Point point = PointTranslate(ui::Point(x, y));
+ x = point.X;
+ y = point.Y;
+ if(ret && y<YRES && x<XRES)
+ if (gameModel->GetActiveTool(0)->GetIdentifier() != "DEFAULT_UI_SIGN" || button != BUTTON_LEFT) //If it's not a sign tool or you are right/middle clicking
+ {
+ sign * foundSign = GetSignAt(x, y);
+ if(foundSign && splitsign(foundSign->text.c_str()))
+ return false;
+ }
+ return ret;
}
bool GameController::MouseUp(int x, int y, unsigned button)
@@ -563,17 +586,15 @@ bool GameController::MouseUp(int x, int y, unsigned button)
{
if (gameModel->GetActiveTool(0)->GetIdentifier() != "DEFAULT_UI_SIGN" || button != BUTTON_LEFT) //If it's not a sign tool or you are right/middle clicking
{
- Simulation * sim = gameModel->GetSimulation();
- for (std::vector<sign>::iterator iter = sim->signs.begin(), end = sim->signs.end(); iter != end; ++iter)
- {
- int signx, signy, signw, signh;
- (*iter).pos((*iter).getText(sim), signx, signy, signw, signh);
- if (x>=signx && x<=signx+signw && y>=signy && y<=signy+signh)
+ sign * foundSign = GetSignAt(x, y);
+ if(foundSign) {
+ const char* str=foundSign->text.c_str();
+ char type;
+ int pos=splitsign(str, &type);
+ if (pos)
{
- const char* str=(*iter).text.c_str();
- int pos=splitsign(str);
- if (pos)
- {
+ ret = false;
+ if(type == 'c' || type == 't') {
char buff[256];
strcpy(buff, str+3);
buff[pos]=0;
@@ -589,7 +610,9 @@ bool GameController::MouseUp(int x, int y, unsigned button)
OpenURI(url);
}
}
- break;
+ } else if(type == 'b') {
+ Simulation * sim = gameModel->GetSimulation();
+ sim->create_part(-1, foundSign->x, foundSign->y, PT_SPRK);
}
}
}
diff --git a/src/gui/game/GameController.h b/src/gui/game/GameController.h
index b2a7d99..9fe3624 100644
--- a/src/gui/game/GameController.h
+++ b/src/gui/game/GameController.h
@@ -56,6 +56,7 @@ public:
GameController();
~GameController();
GameView * GetView();
+ sign * GetSignAt(int x, int y);
bool BrushChanged(int brushType, int rx, int ry);
bool MouseMove(int x, int y, int dx, int dy);
diff --git a/src/gui/game/SignTool.cpp b/src/gui/game/SignTool.cpp
index 9cb389a..fdc1fb5 100644
--- a/src/gui/game/SignTool.cpp
+++ b/src/gui/game/SignTool.cpp
@@ -178,15 +178,19 @@ void SignWindow::DoDraw()
{
sign & currentSign = *iter;
int x, y, w, h, dx, dy;
+ char type = 0;
Graphics * g = ui::Engine::Ref().g;
std::string text = currentSign.getText(sim);
+ splitsign(currentSign.text.c_str(), &type);
currentSign.pos(text, x, y, w, h);
g->clearrect(x, y, w+1, h);
g->drawrect(x, y, w+1, h, 192, 192, 192, 255);
- if (splitsign(currentSign.text.c_str()))
- g->drawtext(x+3, y+3, text, 0, 191, 255, 255);
- else
+ if (!type)
g->drawtext(x+3, y+3, text, 255, 255, 255, 255);
+ else if(type == 'b')
+ g->drawtext(x+3, y+3, text, 211, 211, 40, 255);
+ else
+ g->drawtext(x+3, y+3, text, 0, 191, 255, 255);
x = currentSign.x;
y = currentSign.y;
diff --git a/src/simulation/Sign.cpp b/src/simulation/Sign.cpp
index 57a8a0d..b6a18cc 100644
--- a/src/simulation/Sign.cpp
+++ b/src/simulation/Sign.cpp
@@ -17,30 +17,37 @@ std::string sign::getText(Simulation *sim)
char signText[256];
sprintf(signText, "%s", text.substr(0, 255).c_str());
- if (!strcmp(signText,"{p}"))
+ if(signText[0] && signText[0] == '{')
{
- float pressure = 0.0f;
- if (x>=0 && x<XRES && y>=0 && y<YRES)
- pressure = sim->pv[y/CELL][x/CELL];
- sprintf(buff, "Pressure: %3.2f", pressure); //...pressure
- }
- else if (!strcmp(signText,"{t}"))
- {
- if (x>=0 && x<XRES && y>=0 && y<YRES && sim->pmap[y][x])
- sprintf(buff, "Temp: %4.2f", sim->parts[sim->pmap[y][x]>>8].temp-273.15); //...temperature
+ if (!strcmp(signText,"{p}"))
+ {
+ float pressure = 0.0f;
+ if (x>=0 && x<XRES && y>=0 && y<YRES)
+ pressure = sim->pv[y/CELL][x/CELL];
+ sprintf(buff, "Pressure: %3.2f", pressure); //...pressure
+ }
+ else if (!strcmp(signText,"{t}"))
+ {
+ if (x>=0 && x<XRES && y>=0 && y<YRES && sim->pmap[y][x])
+ sprintf(buff, "Temp: %4.2f", sim->parts[sim->pmap[y][x]>>8].temp-273.15); //...temperature
+ else
+ sprintf(buff, "Temp: 0.00"); //...temperature
+ }
else
- sprintf(buff, "Temp: 0.00"); //...temperature
+ {
+ int pos=splitsign(signText);
+ if (pos)
+ {
+ strcpy(buff, signText+pos+1);
+ buff[strlen(signText)-pos-2]=0;
+ }
+ else
+ strcpy(buff, signText);
+ }
}
else
{
- int pos=splitsign(signText);
- if (pos)
- {
- strcpy(buff, signText+pos+1);
- buff[strlen(signText)-pos-2]=0;
- }
- else
- strcpy(buff, signText);
+ strcpy(buff, signText);
}
return std::string(buff);