Okay, third fourth try at writing this code:
</p><pre>
/*
Showing the applyText function here for reference:</pre>
<div>void applyText(int x,int y,string text)</div>
<div>{</div>
<div>blitImage(TTF_RenderText_Solid( font, text.c_str(), fontcolor ),x,y);</div>
<div>}</div>
<div> </div>
<div> * also for reference:</div>
<div> </div>
<div>void blitImage(SDL_Surface *in,int tx,int ty)</div>
<div>{</div>
<div>SDL_Rect tmp;</div>
<div>tmp.x = tx;</div>
<div>tmp.y = ty;</div>
<div>SDL_BlitSurface(in,NULL,screen,&tmp);</div>
<div>}</div>
<div> */</div>
<div> </div>
<div>int textOffset = 0;</div>
<div> </div>
<div>void showString(const std::string &text)</div>
<div>{</div>
<div> try</div>
<div> {</div>
<div>unsigned int lineNum = 0;</div>
<div> std::string lineText;</div>
<div> </div>
<div>for(unsigned int i = 0; i < text.size(); i++)</div>
<div>{</div>
<div>//Check if it's the end of the line.</div>
<div>if(text[i] == '\n')</div>
<div>{</div>
<div>//Check if there's something to display.</div>
<div>if(!lineText.empty())</div>
<div>{</div>
<div>//Display the line.</div>
<div>applyText(20, (20 * lineNum), lineText);</div>
<div> </div>
<div>//Clear the temporary string.</div>
<div>lineText.clear();</div>
<div>}</div>
<div> </div>
<div>//Increase the line number.</div>
<div>lineNum++;</div>
<div>}</div>
<div>else</div>
<div>{</div>
<div>//Add this character to the temporary string.</div>
<div>lineText.push_back(text[i]);</div>
<div>}</div>
<div>}</div>
<div> </div>
<div>//Display the final line (because there is no final endline).</div>
<div>if(!lineText.empty())</div>
<div>{</div>
<div>applyText(20, (20 * lineNum), lineText);</div>
<div>}</div>
<div> }</div>
<div> catch(exception& e)</div>
<div> {</div>
<div> cerr<<"Exception thrown "<<e.what()<<"\n";</div>
<div> }</div>
<div> catch(...)</div>
<div> {</div>
<div> cerr<<"other exception cought.\n";</div>
<div> } </div>
<div>}</div>
<div> </div>
<div>int getCursorX(string whatToEdit, int cursor)</div>
<div>{</div>
<div> int x = 0;</div>
<div> int y = 0;</div>
<div> for(int a = 0; a<cursor; a++)</div>
<div> {</div>
<div> if(whatToEdit[a] == 0 || whatToEdit[a] == '\n')</div>
<div> {</div>
<div> x = 0;</div>
<div> y++;</div>
<div> }</div>
<div> else</div>
<div> x++;</div>
<div> }</div>
<div> return x;</div>
<div>}</div>
<div> </div>
<div>int getCursorY(string whatToEdit, int cursor)</div>
<div>{</div>
<div> int x = 0;</div>
<div> int y = 0;</div>
<div> for(int a = 0; a<cursor; a++)</div>
<div> {</div>
<div> if(whatToEdit[a] == 0 || whatToEdit[a] == '\n')</div>
<div> {</div>
<div> x = 0;</div>
<div> y++;</div>
<div> }</div>
<div> else</div>
<div> x++;</div>
<div> }</div>
<div> return y;</div>
<div>}</div>
<div> </div>
<div>int xToNextY(string whatToEdit,int cursor)</div>
<div>{</div>
<div> int totalPos = 0;</div>
<div> for(int a = cursor; a<whatToEdit.length(); a++)</div>
<div> {</div>
<div> totalPos++;</div>
<div> if(whatToEdit[a] == 0 || whatToEdit[a] == '\n')</div>
<div> break;</div>
<div> }</div>
<div> return totalPos;</div>
<div>}</div>
<div> </div>
<div>int xToLastY(string whatToEdit,int cursor)</div>
<div>{</div>
<div> int totalPos = 0;</div>
<div> for(int a = cursor; a>0; a--)</div>
<div> {</div>
<div> totalPos++;</div>
<div> if(whatToEdit[a] == 0 || whatToEdit[a] == '\n')</div>
<div> break;</div>
<div> }</div>
<div> return totalPos;</div>
<div>}</div>
<div> </div>
<div>bool cont = true;</div>
<div> </div>
<div>void scriptingWindow(int mobID)</div>
<div>{</div>
<div> try</div>
<div> {</div>
<div> //mob refers to a character in the game</div>
<div> //the string we're probably editing is the characters ai script</div>
<div> </div>
<div> string whatToEdit = mobs[mobID].scriptL;</div>
<div> </div>
<div> textOffset = 0;</div>
<div> int loopStartTime = 0;</div>
<div> bool programcont = true;</div>
<div> SDL_Event programEvent; //there's also another SDL_Event for the main loop</div>
<div> int cursorPos = 0;</div>
<div> Uint8 *keystates;</div>
<div> </div>
<div> while(programcont)</div>
<div> {</div>
<div> loopStartTime = SDL_GetTicks(); //get the time the loop started at</div>
<div> </div>
<div> keystates = SDL_GetKeyState(NULL);</div>
<div> </div>
<div> while(SDL_PollEvent(&programEvent))</div>
<div> {</div>
<div> if(programEvent.type == SDL_QUIT) //break both this loop, and the main loop</div>
<div> {</div>
<div> programcont = false;</div>
<div> cont = false;</div>
<div> break;</div>
<div> }</div>
<div> if(programEvent.type == SDL_KEYDOWN) //only break this loop</div>
<div> {</div>
<div> if(programEvent.key.keysym.sym == SDLK_ESCAPE)</div>
<div> {</div>
<div> programcont = false;</div>
<div> break;</div>
<div> }</div>
<div> else if(programEvent.key.keysym.sym == SDLK_RIGHT)</div>
<div> cursorPos++;</div>
<div> else if(programEvent.key.keysym.sym == SDLK_LEFT)</div>
<div> cursorPos--;</div>
<div> else if(programEvent.key.keysym.sym == SDLK_DOWN)</div>
<div> cursorPos += xToNextY(whatToEdit,cursorPos);</div>
<div> else if(programEvent.key.keysym.sym == SDLK_UP)</div>
<div> {</div>
<div> cursorPos -= xToLastY(whatToEdit,cursorPos);</div>
<div> if(getCursorX(whatToEdit,cursorPos)-textOffset < 5 && textOffset > 0)</div>
<div> textOffset--;</div>
<div> }</div>
<div> else if(keystates[SDLK_LCTRL] && programEvent.key.keysym.sym == SDLK_s)</div>
<div> {</div>
<div> mobs[mobID].scriptL = whatToEdit;</div>
<div> mobs[mobID].ready = false;</div>
<div> programcont = false;</div>
<div> }</div>
<div> else if(programEvent.key.keysym.unicode >= ' ' && programEvent.key.keysym.unicode <= '}')</div>
<div> {</div>
<div> whatToEdit = whatToEdit.substr(0,cursorPos) + (char)programEvent.key.keysym.unicode + whatToEdit.substr(cursorPos,whatToEdit.length()-cursorPos);</div>
<div> cursorPos++;</div>
<div> }</div>
<div> else if(programEvent.key.keysym.sym == SDLK_BACKSPACE && cursorPos > 0)</div>
<div> {</div>
<div> whatToEdit.erase(cursorPos-1,1);</div>
<div> cursorPos--;</div>
<div> }</div>
<div> else if(programEvent.key.keysym.sym == SDLK_DELETE && cursorPos < whatToEdit.length()-1)</div>
<div> whatToEdit.erase(cursorPos,1);</div>
<div> else if(programEvent.key.keysym.sym == SDLK_RETURN)</div>
<div> {</div>
<div> whatToEdit = whatToEdit.substr(0,cursorPos) + '\n' + whatToEdit.substr(cursorPos,whatToEdit.length()-cursorPos);</div>
<div> cursorPos++;</div>
<div> }</div>
<div> }</div>
<div> else if(programEvent.type == SDL_MOUSEBUTTONDOWN)</div>
<div> {</div>
<div> if(programEvent.button.button == SDL_BUTTON_WHEELUP)</div>
<div> {</div>
<div> cursorPos -= xToLastY(whatToEdit,cursorPos);</div>
<div> if(getCursorX(whatToEdit,cursorPos)-textOffset < 5 && textOffset > 0)</div>
<div> textOffset--;</div>
<div> }</div>
<div> else if(programEvent.button.button == SDL_BUTTON_WHEELDOWN)</div>
<div> cursorPos += xToNextY(whatToEdit,cursorPos);</div>
<div> }</div>
<div> }</div>
<div> </div>
<div> if(cursorPos < 0)</div>
<div> cursorPos = 0;</div>
<div> if(cursorPos > whatToEdit.length()-1)</div>
<div> cursorPos = whatToEdit.length()-1;</div>
<div> </div>
<div> if(getCursorY(whatToEdit,cursorPos)-textOffset > 30)</div>
<div> textOffset++;</div>
<div> </div>
<div> clearScreen(); //Paint a black rectangle over the whole screen.</div>
<div> </div>
<div> showString(whatToEdit); //show the lines of text</div>
<div> applyTextRed(20+(getCursorX(whatToEdit,cursorPos)*10),20*(getCursorY(whatToEdit,cursorPos)-textOffset),"|");</div>
<div> </div>
<div> flipScreen(); //SDL_Flip(screen);</div>
<div> </div>
<div> if(SDL_GetTicks()-loopStartTime > 200)</div>
<div> {</div>
<div> cerr<<"Crash prevention executed.\n";</div>
<div> programcont = false;</div>
<div> cont = false; //crash prevention</div>
<div> break; //exit the program if this loop takes far longer than normal to complete</div>
<div> }</div>
<div> }</div>
<div> }</div>
<div> catch (exception& e)</div>
<div> {</div>
<div> cerr<<"Exception cought "<<e.what()<<"\n";</div>
<div> }</div>
<div> catch(...)</div>
<div> {</div>
<div> cerr<<"other exception cought.\n";</div>
<div> }</div>
<div>}</div>
<div>





