Fixing lss nade spawn, some HUDEXTRAS stuff, and temporarily reverting the cursor related functions to 1.0.4 ones
git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5076 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
+166
-68
@@ -21,7 +21,7 @@ template<class LINE> struct consolebuffer
|
||||
maxlines = numlines;
|
||||
while(conlines.length() > maxlines) delete[] conlines.pop().line;
|
||||
}
|
||||
|
||||
|
||||
virtual ~consolebuffer()
|
||||
{
|
||||
while(conlines.length()) delete[] conlines.pop().line;
|
||||
@@ -30,9 +30,13 @@ template<class LINE> struct consolebuffer
|
||||
virtual void render() = 0;
|
||||
};
|
||||
|
||||
/** This is the 1.0.4 structure
|
||||
It will substituted by textinputbuffer_wip
|
||||
I am putting this temporarily here to fix the weird cursor behavior
|
||||
Please, read the comments in rendercommand::console.cpp : Brahma */
|
||||
struct textinputbuffer
|
||||
{
|
||||
string buf;
|
||||
string buf;
|
||||
int pos, max;
|
||||
|
||||
textinputbuffer() : pos(-1), max(0)
|
||||
@@ -58,100 +62,194 @@ struct textinputbuffer
|
||||
|
||||
case SDLK_DELETE:
|
||||
{
|
||||
if(pos < 0) break;
|
||||
|
||||
std::string s(buf);
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
std::string::iterator first = s.begin();
|
||||
std::string::iterator second = s.begin();
|
||||
utf8::advance(first, pos, s.end());
|
||||
utf8::advance(second, pos + 1, s.end());
|
||||
s.erase(first, second);
|
||||
strcpy(buf, s.c_str());
|
||||
|
||||
int len = (int)strlen(buf);
|
||||
if(pos<0) break;
|
||||
memmove(&buf[pos], &buf[pos+1], len - pos);
|
||||
if(pos>=len-1) pos = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
case SDLK_BACKSPACE:
|
||||
{
|
||||
std::string s(buf);
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
int i = pos>=0 ? pos : len;
|
||||
if(i<1) break;
|
||||
|
||||
std::string::iterator first = s.begin();
|
||||
std::string::iterator second = s.begin();
|
||||
utf8::advance(first, i - 1, s.end());
|
||||
utf8::advance(second, i, s.end());
|
||||
s.erase(first, second);
|
||||
strcpy(buf, s.c_str());
|
||||
|
||||
if(pos > 0) pos--;
|
||||
else if(!pos && len <=1 ) pos = -1;
|
||||
int len = (int)strlen(buf), i = pos>=0 ? pos : len;
|
||||
if(i<1) break;
|
||||
memmove(&buf[i-1], &buf[i], len - i + 1);
|
||||
if(pos>0) pos--;
|
||||
else if(!pos && len<=1) pos = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
case SDLK_LEFT:
|
||||
{
|
||||
std::string s(buf);
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
|
||||
if(pos > 0) pos--;
|
||||
else if(pos < 0) pos = len-1;
|
||||
else if(pos < 0) pos = (int)strlen(buf)-1;
|
||||
break;
|
||||
}
|
||||
|
||||
case SDLK_RIGHT:
|
||||
{
|
||||
std::string s(buf);
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
if(pos>=0 && ++pos >= len) pos = -1;
|
||||
if(pos>=0 && ++pos>=(int)strlen(buf)) pos = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
case SDLK_v:
|
||||
extern void pasteconsole(char *dst);
|
||||
#ifdef __APPLE__
|
||||
#define MOD_KEYS (KMOD_LMETA|KMOD_RMETA)
|
||||
#else
|
||||
#define MOD_KEYS (KMOD_LCTRL|KMOD_RCTRL)
|
||||
#endif
|
||||
#ifdef __APPLE__
|
||||
#define MOD_KEYS (KMOD_LMETA|KMOD_RMETA)
|
||||
#else
|
||||
#define MOD_KEYS (KMOD_LCTRL|KMOD_RCTRL)
|
||||
#endif
|
||||
if(SDL_GetModState()&MOD_KEYS)
|
||||
{
|
||||
pasteconsole(buf);
|
||||
return true;
|
||||
}
|
||||
// fall through
|
||||
|
||||
|
||||
default:
|
||||
{
|
||||
if(unicode)
|
||||
{
|
||||
std::string s(buf);
|
||||
char tmp[5] = { 0, 0, 0, 0, 0 };
|
||||
utf8::append(unicode, tmp);
|
||||
std::string newchar(tmp);
|
||||
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
if(max && (int)len>=max) break;
|
||||
|
||||
if(s.length() + newchar.length() < sizeof(buf))
|
||||
{
|
||||
if(pos < 0)
|
||||
{
|
||||
s.append(newchar);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string::iterator first = s.begin();
|
||||
utf8::advance(first, pos + 1, s.end());
|
||||
s.insert(first, newchar.begin(), newchar.end());
|
||||
pos++;
|
||||
}
|
||||
strcpy(buf, s.c_str());
|
||||
return true;
|
||||
}
|
||||
size_t len = strlen(buf);
|
||||
if(max && (int)len>=max) break;
|
||||
if(len+1 < sizeof(buf))
|
||||
{
|
||||
if(pos < 0) buf[len] = unicode;
|
||||
else
|
||||
{
|
||||
memmove(&buf[pos+1], &buf[pos], len - pos);
|
||||
buf[pos++] = unicode;
|
||||
}
|
||||
buf[len+1] = '\0';
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/** WIP ALERT */
|
||||
struct textinputbuffer_wip
|
||||
{
|
||||
string buf;
|
||||
int pos, max;
|
||||
|
||||
textinputbuffer_wip() : pos(-1), max(0)
|
||||
{
|
||||
buf[0] = '\0';
|
||||
}
|
||||
|
||||
bool key(int code, bool isdown, int unicode)
|
||||
{
|
||||
switch(code)
|
||||
{
|
||||
case SDLK_RETURN:
|
||||
case SDLK_KP_ENTER:
|
||||
break;
|
||||
|
||||
case SDLK_HOME:
|
||||
if(strlen(buf)) pos = 0;
|
||||
break;
|
||||
|
||||
case SDLK_END:
|
||||
pos = -1;
|
||||
break;
|
||||
|
||||
case SDLK_DELETE:
|
||||
{
|
||||
if(pos < 0) break;
|
||||
|
||||
std::string s(buf);
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
std::string::iterator first = s.begin();
|
||||
std::string::iterator second = s.begin();
|
||||
utf8::advance(first, pos, s.end());
|
||||
utf8::advance(second, pos + 1, s.end());
|
||||
s.erase(first, second);
|
||||
strcpy(buf, s.c_str());
|
||||
|
||||
if(pos>=len-1) pos = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
case SDLK_BACKSPACE:
|
||||
{
|
||||
std::string s(buf);
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
int i = pos>=0 ? pos : len;
|
||||
if(i<1) break;
|
||||
|
||||
std::string::iterator first = s.begin();
|
||||
std::string::iterator second = s.begin();
|
||||
utf8::advance(first, i - 1, s.end());
|
||||
utf8::advance(second, i, s.end());
|
||||
s.erase(first, second);
|
||||
strcpy(buf, s.c_str());
|
||||
|
||||
if(pos > 0) pos--;
|
||||
else if(!pos && len <=1 ) pos = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
case SDLK_LEFT:
|
||||
{
|
||||
std::string s(buf);
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
|
||||
if(pos > 0) pos--;
|
||||
else if(pos < 0) pos = len-1;
|
||||
break;
|
||||
}
|
||||
|
||||
case SDLK_RIGHT:
|
||||
{
|
||||
std::string s(buf);
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
if(pos>=0 && ++pos >= len) pos = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
case SDLK_v:
|
||||
extern void pasteconsole(char *dst);
|
||||
#ifdef __APPLE__
|
||||
#define MOD_KEYS (KMOD_LMETA|KMOD_RMETA)
|
||||
#else
|
||||
#define MOD_KEYS (KMOD_LCTRL|KMOD_RCTRL)
|
||||
#endif
|
||||
if(SDL_GetModState()&MOD_KEYS)
|
||||
{
|
||||
pasteconsole(buf);
|
||||
return true;
|
||||
}
|
||||
// fall through
|
||||
|
||||
default:
|
||||
{
|
||||
if(unicode)
|
||||
{
|
||||
std::string s(buf);
|
||||
char tmp[5] = { 0, 0, 0, 0, 0 };
|
||||
utf8::append(unicode, tmp);
|
||||
std::string newchar(tmp);
|
||||
|
||||
int len = utf8::distance(s.begin(), s.end());
|
||||
if(max && (int)len>=max) break;
|
||||
|
||||
if(s.length() + newchar.length() < sizeof(buf))
|
||||
{
|
||||
if(pos < 0)
|
||||
{
|
||||
s.append(newchar);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string::iterator first = s.begin();
|
||||
utf8::advance(first, pos + 1, s.end());
|
||||
s.insert(first, newchar.begin(), newchar.end());
|
||||
pos++;
|
||||
}
|
||||
strcpy(buf, s.c_str());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user