Пример #1
0
// Throws if the field or its class is not found.
extern "C" void* j3StaticFieldLookup(UserClass* caller, uint32 index) {
  
  void* res = 0;
  
  UserConstantPool* ctpInfo = caller->getConstantPool();
  
  if (ctpInfo->ctpRes[index]) {
    res = ctpInfo->ctpRes[index];
  } else {
  
    UserCommonClass* cl = 0;
    UserClass* fieldCl = 0;
    const UTF8* utf8 = 0;
    Typedef* sign = 0;
  
    ctpInfo->resolveField(index, cl, utf8, sign);
 
    assert(cl->asClass() && "Lookup a field of something not an array");
    JavaField* field = cl->asClass()->lookupField(utf8, sign->keyName, true,
                                                  true, &fieldCl);
    
    fieldCl->initialiseClass(JavaThread::get()->getJVM());
    void* obj = ((UserClass*)fieldCl)->getStaticInstance();
  
    assert(obj && "No static instance in static field lookup");
  
    void* ptr = (void*)((uint64)obj + field->ptrOffset);
    ctpInfo->ctpRes[index] = ptr;
   
    res = ptr;
  }

  return res;
}
Пример #2
0
/*モードチェンジ*/
void TextClass::ModeChange(int &ModeFlag,int &ChangeFlag,UserClass &User){
	//インスタンス化
	MouseClass* Mouse = MouseClass::GetInstance();
	AnimeClass Anime;

	static int Count = 0;

	const int AtherSelect = -1;

	//タイマー
	static int Timer = 0;
	if( WriteMode != NOTWINDOW ) Timer++;

	//モードチェンジ
	if( Mouse->GetState(MOUSE::LEFT) == TRUE ){
		if( Select == GAME_MENU::SAVE )    ModeFlag  = MODE::SAVE;
		if( Select == GAME_MENU::LOAD )    ModeFlag  = MODE::LOAD;
		if( Select == GAME_MENU::BACKLOG ) WriteMode = BACKLOG;
		if( Select == GAME_MENU::CONFIG  ) ModeFlag  = MODE::CONFIG;
		if( Select == GAME_MENU::AUTO )    AutoFlag *= -1;
		ChangeFlag = TRUE;
	}

	//ウィンドウ非表示
	/*
	if( Mouse->GetState( MOUSE::RIGHT) > 0 && WriteMode == NORMAL && Timer > 20 ){
		WriteMode = NOTWINDOW;
		Timer = 0;
	}
	*/

	//バックログ
	if( Mouse->GetWheel() > 0 && WriteMode == NORMAL ) WriteMode = BACKLOG;

	//エンディングモードへ
	if( WriteMode == END ){ //&& Mouse->GetState(MOUSE::LEFT) > 10 ){
		Select    = AtherSelect;
		WriteMode = NORMAL;
		ModeFlag = MODE::END;
		//ModeFlag = MODE::OTHER;
		//User.SetPage( PAGE::TITLE );
	}

	//タイトル画面へ
	if( WriteMode == TITLE ){
		Count++;
		DrawBox(0,0,windowX,windowY,GetColor(0,0,0),TRUE);
		SetFontSize(100);
		ChangeFont("MS 明朝");
		DrawString(windowX/3,windowY/3,"- FIN - ",GetColor(255,255,255));
		User.SetBGMCode( GAME_BGM::STOP );
		if( Count > 200 ){
			WriteMode = NORMAL;
			ModeFlag = MODE::OTHER;
			User.SetPage( PAGE::TITLE );
			Count = 0;
		}
		
	}
}
Пример #3
0
extern "C" void* j3ResolveStaticStub() {
  JavaThread *th = JavaThread::get();
  void* result = NULL;

  // Lookup the caller of this class.
  vmkit::StackWalker Walker(th);
  ++Walker; // Remove the stub.
  vmkit::FrameInfo* FI = Walker.get();
  assert(FI->Metadata != NULL && "Wrong stack trace");
  JavaMethod* caller = (JavaMethod*)FI->Metadata;

  // Lookup the method info in the constant pool of the caller.
  uint16 ctpIndex = caller->lookupCtpIndex(FI);
  assert(ctpIndex && "No constant pool index");
  JavaConstantPool* ctpInfo = caller->classDef->getConstantPool();
  CommonClass* cl = 0;
  const UTF8* utf8 = 0;
  Signdef* sign = 0;

  ctpInfo->resolveMethod(ctpIndex, cl, utf8, sign);
  UserClass* lookup = cl->isArray() ? cl->super : cl->asClass();
  assert(lookup->isInitializing() && "Class not ready");
  JavaMethod* callee = lookup->lookupMethod(utf8, sign->keyName, true, true, 0);

  // Compile the found method.
  result = callee->compiledPtr();
    
  // Update the entry in the constant pool.
  ctpInfo->ctpRes[ctpIndex] = result;

  return result;
}
Пример #4
0
// Throws if the field is not found.
extern "C" void* j3VirtualFieldLookup(UserClass* caller, uint32 index) {
  
  void* res = 0;

  UserConstantPool* ctpInfo = caller->getConstantPool();
  if (ctpInfo->ctpRes[index]) {
    res = ctpInfo->ctpRes[index];
  } else {
  
    UserCommonClass* cl = 0;
    const UTF8* utf8 = 0;
    Typedef* sign = 0;
  
    ctpInfo->resolveField(index, cl, utf8, sign);
 
    UserClass* lookup = cl->isArray() ? cl->super : cl->asClass();
    JavaField* field = lookup->lookupField(utf8, sign->keyName, false, true, 0);
  
    ctpInfo->ctpRes[index] = (void*)(intptr_t)field->ptrOffset;
  
    res = (void*)(intptr_t)field->ptrOffset;
  }

  return res;
}
Пример #5
0
UserClass* JnjvmClassLoader::constructClass(const UTF8* name,
                                            ClassBytes* bytes) {
  JavaObject* excp = NULL;
  llvm_gcroot(excp, 0);
  UserClass* res = NULL;
  lock2.lock();
  classes->lock.lock();
  res = (UserClass*) classes->map.lookup(name);
  classes->lock.unlock();
  if (res == NULL) {
    TRY {
      const UTF8* internalName = readerConstructUTF8(name->elements, name->size);
      res = new(allocator, "Class") UserClass(this, internalName, bytes);
      res->readClass();
      res->makeVT();
      getCompiler()->resolveVirtualClass(res);
      getCompiler()->resolveStaticClass(res);
      classes->lock.lock();
      assert(res->getDelegatee() == NULL);
      assert(res->getStaticInstance() == NULL);
      assert(classes->map.lookup(internalName) == NULL);
      classes->map[internalName] = res;
      classes->lock.unlock();
    } CATCH {
      excp = JavaThread::get()->pendingException;
      JavaThread::get()->clearException();    
    } END_CATCH;
  }
Пример #6
0
// Throws if the method is not found.
extern "C" uint32 j3VirtualTableLookup(UserClass* caller, uint32 index,
                                       uint32* offset, JavaObject* obj) {
  llvm_gcroot(obj, 0);
  uint32 res = 0;
  
  UserCommonClass* cl = 0;
  const UTF8* utf8 = 0;
  Signdef* sign = 0;
  
  caller->getConstantPool()->resolveMethod(index, cl, utf8, sign);
  UserClass* lookup = cl->isArray() ? cl->super : cl->asClass();
  JavaMethod* dmeth = lookup->lookupMethodDontThrow(utf8, sign->keyName, false,
                                                    true, 0);
  if (!dmeth) {
    assert((JavaObject::getClass(obj)->isClass() && 
            JavaObject::getClass(obj)->asClass()->isInitializing()) &&
           "Class not ready in a virtual lookup.");
    // Arg, the bytecode is buggy! Perform the lookup on the object class
    // and do not update offset.
    lookup = JavaObject::getClass(obj)->isArray() ?
      JavaObject::getClass(obj)->super : 
      JavaObject::getClass(obj)->asClass();
    dmeth = lookup->lookupMethod(utf8, sign->keyName, false, true, 0);
  } else {
    *offset = dmeth->offset;
  }

  assert(dmeth->classDef->isInitializing() && 
         "Class not ready in a virtual lookup.");

  res = dmeth->offset;

  return res;
}
Пример #7
0
/*ゲームカウント初期化*/
void TextClass::InitGameCount(UserClass& User){
	//ゲームカウント取得
	SaveData   = User.GetSaveData();
	SceneCount = SaveData.SceneCount;
	TextCount  = SaveData.TextCount;
	SerifCount = SaveData.SerifCount;
	User.SetBGMCode ( SaveData.BGMCode  );
	User.SetBackCode( SaveData.BackCode );
	User.SetCharacterCode( SaveData.CharCode );
}
Пример #8
0
void
tryIt(const String& filename)
{
    try {
        UserClass u;
        u.f(filename);
        cout << "  OK\n";
    }
    catch (const BadFileName& e) {
        cout << "  Finish recovering from bad-file-name\n";
    }
}
Пример #9
0
JavaObjectMethod* JavaObjectMethod::createFromInternalMethod(JavaMethod* meth, int i) {
  JavaObjectMethod* ret = 0;
  JavaString* str = 0;
  JavaObject* pArr = 0;
  JavaObject* eArr = 0;
  JavaObject* retTy = 0;
  ArraySInt8* ann = 0;
  ArraySInt8* pmAnn = 0;
  ArraySInt8* defAnn = 0;
  llvm_gcroot(ret, 0);
  llvm_gcroot(str, 0);
  llvm_gcroot(pArr, 0);
  llvm_gcroot(eArr, 0);
  llvm_gcroot(retTy, 0);
  llvm_gcroot(ann, 0);
  llvm_gcroot(pmAnn, 0);
  llvm_gcroot(defAnn, 0);

  // TODO: check parameter types
  Jnjvm* vm = JavaThread::get()->getJVM();
  JnjvmClassLoader * classLoader = meth->classDef->classLoader;

  UserClass* Meth = vm->upcalls->newMethod;
  ret = (JavaObjectMethod*)Meth->doNew(vm);
  str = vm->internalUTF8ToStr(meth->name);
  pArr = meth->getParameterTypes(classLoader);
  eArr = meth->getExceptionTypes(classLoader);
  retTy = meth->getReturnType(classLoader);
  JavaString ** sig = getSignature(meth);
  ann = getAnnotations(meth);
  pmAnn = getParamAnnotations(meth);
  defAnn = getAnnotationDefault(meth);

  JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm);
  vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,
    Cl,           /* declaring class */
    &str,         /* name */
    &pArr,        /* parameter types */
    &retTy,       /* return type */
    &eArr,        /* exceptions */
    meth->access, /* modifiers */
    i,            /* slot */
    sig,          /* signature */
    &ann,         /* annotations */
    &pmAnn,       /* parameter annotations */
    &defAnn);     /* default annotations */

  return ret;
}
Пример #10
0
extern "C" JavaObject* nativeGetCallingClass() {
  
  JavaObject* res = 0;
  llvm_gcroot(res, 0);

  BEGIN_NATIVE_EXCEPTION(0)

  JavaThread* th = JavaThread::get();
  UserClass* cl = th->getCallingClassLevel(2);
  if (cl != NULL) res = cl->getClassDelegatee(th->getJVM());
  
  END_NATIVE_EXCEPTION

  return res;
}
Пример #11
0
extern "C" JavaObject* Java_gnu_classpath_VMStackWalker_getCallingClass__() {
  
  JavaObject* res = 0;
  llvm_gcroot(res, 0);

  BEGIN_NATIVE_EXCEPTION(0)

  JavaThread* th = JavaThread::get();
  UserClass* cl = th->getCallingClassLevel(2);
  if (cl != NULL) res = cl->getClassDelegatee(th->getJVM());
  
  END_NATIVE_EXCEPTION

  return res;
}
Пример #12
0
/*様々なテキストチェック*/
void TextClass::CheckText(UserClass &User){
	//メニュー決定フラグを折っておく
	MenuEnterFlag = 0;

	const int AtherSelect = -1;

	//一回目フラグ
	static bool FirstFlag = FALSE;

	//シーンの終わりなら、次のシーンへ(カウント更新)
	if( TextCount >= LineMax[SceneCount] ){
		SceneCount++;
		TextCount  = 0;
		SerifCount = 0;

		//ユーザークラスに渡す
		SaveData.SceneCount = SceneCount;
		SaveData.TextCount  = TextCount;
		SaveData.SerifCount = SerifCount;
		User.SetSaveData(SaveData);
		
		//アイキャッチを動作させる
		WriteMode = EYECATCH;
	}

	//シーンのはじめにアイキャッチを動作させる
	if( SceneCount == 0 && TextCount == 0 && FirstFlag == FALSE ){
		Select    = AtherSelect;
		WriteMode = EYECATCH;
		FirstFlag = TRUE;
	}
	if( TextCount > 0 ) FirstFlag = FALSE;
	

}
Пример #13
0
/*コンフィグの未読スキップ許可設定*/
void TextClass::ReadUpdate(UserClass &User){
	short int WriteData[2];
	FILE *fp;

	int SkipFlag;

	//スキップフラグを取得
	SkipFlag = User.GetSkipFlag();

	//許可
	if( SkipFlag == 0 ){
		SkipPermitFlag = 1;
		//fp = fopen("./resource/data/read.dat","wb+");
		//WriteData[0] = 999;
		//WriteData[1] = 999;
		//fwrite(WriteData,2,sizeof(short int),fp);
		//fclose(fp);
	}


	//禁止
	if( SkipFlag == 1 ){
		SkipPermitFlag = 0;
	/*	fp = fopen("./resource/data/read.dat","wb+");
		WriteData[0] = SceneCount;
		WriteData[1] = TextCount;
		fwrite(WriteData,2,sizeof(short int),fp);
		fclose(fp);*/
	}
}
Пример #14
0
extern "C" JavaObject* Java_sun_reflect_Reflection_getCallerClass__I(uint32 index) {
  
  JavaObject* res = 0;
  llvm_gcroot(res, 0);
  
  BEGIN_NATIVE_EXCEPTION(0)
  
  JavaThread* th = JavaThread::get();
  Jnjvm* vm = th->getJVM();
  UserClass* cl = th->getCallingClassLevel(index);
  if (cl) res = cl->getClassDelegatee(vm);
  
  END_NATIVE_EXCEPTION

  return res;
}
Пример #15
0
JavaObjectField* JavaObjectField::createFromInternalField(JavaField* field, int i) {
  JavaObjectField* ret = 0;
  JavaString* name = 0;
  ArraySInt8* ann = 0;
  llvm_gcroot(ret, 0);
  llvm_gcroot(name, 0);
  llvm_gcroot(ann, 0);

  // TODO: check parameter types
  Jnjvm* vm = JavaThread::get()->getJVM();
  UserClass* Field = vm->upcalls->newField;
  ret = (JavaObjectField*)Field->doNew(vm);
  name = vm->internalUTF8ToStr(field->name);

  //type->Class
  JnjvmClassLoader* loader = field->classDef->classLoader;
  UserCommonClass * fieldCl = field->getSignature()->assocClass(loader);
  assert(fieldCl);
  JavaObject* const* type = fieldCl->getClassDelegateePtr(vm);
  JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm);

  JavaString** sig = getSignature(field);
  ann = getAnnotations(field);

  /* java.reflect.Field(
  *   Class declaringClass,
  *   String name,
  *   Class type,
  *   int modifiers,
  *   int slot,
  *   String signature,
  *   byte[] annotations)
  */
  vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,
    Cl,
    &name,
    type,
    field->access,
    i,
    sig,
    &ann);

  return ret;
}
Пример #16
0
/*キャラクタ描画*/
void TextGraphClass::DrawChar(UserClass &User){
	//キャラクタ描画
	switch( User.GetCharacterCode() ){
		case GAME_CHAR::AI:
			DrawGraph(CharacterPoint[GRAPH::X],CharacterPoint[GRAPH::Y],CharacterHandle,TRUE);
		break;

		case GAME_CHAR::NOT:
		break;
	}
}
Пример #17
0
int main()
{
	SortStrategy* s = new ShellSort();
	UserClass* c = new UserClass(s);
	c->sort(); // mit Shellsort sortieren 

	//Algorithmus wechseln 
	c->changeStrategy(new QuickSort());
	c->sort(); // jetzt wird mit Quicksort sortiert 

	// in C++ müssen wir selbst allozierte Speicherbereiche auch wieder freigeben: 
	delete s;
	delete c;

	// ACHTUNG: Beim Aufruf von "c->changeStrategy(new QuickSort());" haben wir uns jedoch nicht 
	// die Speicheradresse des neuen QuickSort-Objekt 
	// gemerkt und können es somit auch nicht selbst wieder freigeben. D. h., hier würde ein Memory 
	// Leak entstehen, wenn das Programm noch länger laufen würde.

	return 0;
}
Пример #18
0
JavaObjectConstructor* JavaObjectConstructor::createFromInternalConstructor(JavaMethod * cons, int i) {
  JavaObjectConstructor* ret = 0;
  JavaObject* pArr = 0;
  JavaObject* eArr = 0;
  ArraySInt8* ann = 0;
  ArraySInt8* pmAnn = 0;
  llvm_gcroot(ret, 0);
  llvm_gcroot(pArr, 0);
  llvm_gcroot(eArr, 0);
  llvm_gcroot(ann, 0);
  llvm_gcroot(pmAnn, 0);

  Jnjvm* vm = JavaThread::get()->getJVM();
  JnjvmClassLoader * classLoader = cons->classDef->classLoader;

  UserClass* Cons = vm->upcalls->newConstructor;
  pArr = cons->getParameterTypes(classLoader);
  eArr = cons->getExceptionTypes(classLoader);
  ret = (JavaObjectConstructor*)Cons->doNew(vm);
  JavaObject* const* Cl = cons->classDef->getDelegateePtr();

  JavaString ** sig = getSignature(cons);
  ann = getAnnotations(cons);
  pmAnn = getParamAnnotations(cons);

  vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,
    Cl,           /* declaringClass */
    &pArr,        /* parameterTypes */
    &eArr,        /* checkedExceptions */
    cons->access, /* modifiers */
    i,            /* slot */
    sig,          /* String signature */
    &ann,         /* annotations */
    &pmAnn        /* parameterAnnotations */
  );

  return ret;
}
Пример #19
0
JavaString* JavaString::stringDup(const ArrayUInt16*& _array, Jnjvm* vm) {
  
  JavaString* res = 0;
  const ArrayUInt16* array = _array;
  llvm_gcroot(array, 0);
  llvm_gcroot(res, 0);

  UserClass* cl = vm->upcalls->newString;
  res = (JavaString*)cl->doNew(vm);
  
  // It's a hashed string, set the destructor so that the string
  // removes itself from the vm string map. Do this only if
  // internStringVT exists (in case of AOT).
  if (internStringVT) res->setVirtualTable(internStringVT);

  // No need to call the Java function: both the Java function and
  // this function do the same thing.
  JavaString::setValue(res, array);
  res->count = ArrayUInt16::getSize(array);
  res->offset = 0;
  res->cachedHashCode = 0;
  return res;
}
Пример #20
0
/*現在のデータをセット*/
void TextClass::SetGameData(UserClass &User){
	//時間関係
	time_t now;
	struct tm *Date;

	time(&now);
	Date = localtime(&now);
	
	SaveData.SceneCount = SceneCount;
	SaveData.TextCount  = TextCount;
	SaveData.SerifCount = SerifCount;
	SaveData.BGMCode    = User.GetBGMCode();
	SaveData.BackCode   = User.GetBackCode();
	SaveData.CharCode	= User.GetCharacterCode();
	SaveData.Year		= Date->tm_year+1900;
	SaveData.Mon		= Date->tm_mon+1;
	SaveData.Day		= Date->tm_mday;
	SaveData.TextLength = Text[SceneCount][TextCount].size();
	strcpy(SaveData.Text,Text[SceneCount][TextCount].c_str());

	//現在カウントを更新
	User.SetSaveData(SaveData);
}
Пример #21
0
/*背景描画*/
void TextGraphClass::DrawBack(UserClass &User){
	//背景描画
	switch( User.GetBackCode() ){
		case GAME_BACK::KAWARA:
			DrawGraph(GameBackPoint[GRAPH::X],GameBackPoint[GRAPH::Y],GameBackHandle[GAME_BACK::KAWARA],TRUE);
		break;	
	
		case GAME_BACK::YOZORA:
			DrawGraph(GameBackPoint[GRAPH::X],GameBackPoint[GRAPH::Y],GameBackHandle[GAME_BACK::YOZORA],TRUE);
		break;

		case GAME_BACK::BLACK:
			DrawBox(0,0,windowX,windowY,GetColor(0,0,0),TRUE);
		break;
	}
}
Пример #22
0
extern "C" void* j3ResolveVirtualStub(JavaObject* obj) {
  llvm_gcroot(obj, 0);
  JavaThread *th = JavaThread::get();
  UserCommonClass* cl = JavaObject::getClass(obj);
  void* result = NULL;
  
  // Lookup the caller of this class.
  vmkit::StackWalker Walker(th);
  ++Walker; // Remove the stub.
  vmkit::FrameInfo* FI = Walker.get();
  assert(FI->Metadata != NULL && "Wrong stack trace");
  JavaMethod* meth = (JavaMethod*)FI->Metadata;

  // Lookup the method info in the constant pool of the caller.
  uint16 ctpIndex = meth->lookupCtpIndex(FI);
  assert(ctpIndex && "No constant pool index");
  JavaConstantPool* ctpInfo = meth->classDef->getConstantPool();
  CommonClass* ctpCl = 0;
  const UTF8* utf8 = 0;
  Signdef* sign = 0;
  JavaMethod* origMeth = 0;
  ctpInfo->infoOfMethod(ctpIndex, ACC_VIRTUAL, ctpCl, origMeth);

  ctpInfo->resolveMethod(ctpIndex, ctpCl, utf8, sign);
  assert(cl->isSubclassOf(ctpCl) && "Wrong call object");
  UserClass* lookup = cl->isArray() ? cl->super : cl->asClass();
  JavaMethod* Virt = lookup->lookupMethod(utf8, sign->keyName, false, true, 0);

  if (isAbstract(Virt->access)) {
    JavaThread::get()->getJVM()->abstractMethodError(Virt->classDef, Virt->name);
  }

  // Compile the found method.
  result = Virt->compiledPtr(lookup);

  // Update the virtual table.
  assert(lookup->isResolved() && "Class not resolved");
  assert(lookup->isInitializing() && "Class not ready");
  assert(lookup->virtualVT && "Class has no VT");
  assert(lookup->virtualTableSize > Virt->offset && 
         "The method's offset is greater than the virtual table size");
  ((void**)obj->getVirtualTable())[Virt->offset] = result;
  
  if (isInterface(origMeth->classDef->access)) {
    InterfaceMethodTable* IMT = cl->virtualVT->IMT;
    uint32_t index = InterfaceMethodTable::getIndex(Virt->name, Virt->type);
    if ((IMT->contents[index] & 1) == 0) {
      IMT->contents[index] = (word_t)result;
    } else { 
      JavaMethod* Imeth = 
        ctpCl->asClass()->lookupInterfaceMethodDontThrow(utf8, sign->keyName);
      assert(Imeth && "Method not in hierarchy?");
      word_t* table = (word_t*)(IMT->contents[index] & ~1);
      uint32 i = 0;
      while (table[i] != (word_t)Imeth) { i += 2; }
      table[i + 1] = (word_t)result;
    }
  }

  return result;
}
Пример #23
0
/*テキスト描画*/
void TextClass::WriteText(UserClass &User){
	//変数宣言
	static int  WriteCount  = 0;					//書き込み時カウント
	static int  WriteIndex[3] = {0,0,0};			//現在何文字目か
	static int  WriteX = 0;							//書き込みX軸座標
	static int  WriteY = 0;							//書き込みY座標
	static int  OldTextCount;						//前のテキストカウントを取得
	static int  WriteLine;							//描画する行
	int  Length;									//文字数
	int  TmpCount  = 0;								//一時カウンタ
	int  LoopCount = 0;								//ループ用カウンタ
	char WriteText[3];								//書き込み文字

	//定数定義	
	const int DrawX		= 250;							//描画基準X座標						
	const int DrawY		= windowY - windowY / 3 + 50;	//描画基準Y座標
	const int TextSpace = 14;							//文字と文字の間隔
	const int LineSpace = 40;							//行と行の間隔
	const int FontSize  = 28;							//フォントサイズ
	int DrawSpeed;										//文字の描画速度
	

	//文字の描画速度を取得
	if( AutoFlag == 1 ) DrawSpeed = User.GetAutoTextSpeed();
	else				DrawSpeed = User.GetTextSpeed();


	//テキストが進んだら変数初期化
	if( TextCount != OldTextCount ){
		memset(WriteIndex,0,sizeof(WriteIndex));
		WriteCount = 0;
		WriteX     = 0;
		WriteY     = 0;
		WriteLine   = 0;
	}
	//前のテキストカウントを取得(上の初期化のため)
	OldTextCount = TextCount;

	//フォントサイズ
	//SetFontSize(FontSize);

	//現在表示されている文字数だけ表示する(Lineは行数を示し、最大行数分ループする)
	for( int Line=0 ; Line<LineNo[SceneCount][SerifCount] ; Line++ ){

		//描画が完了している行まで描画
		if( Line <= WriteLine ){
			LoopCount = 0;																								//ループカウンタ初期化
			while( LoopCount <= WriteIndex[Line] ){																		//書き込み可能文字数以下なら
				WriteX = LoopCount * TextSpace;																			//描画X座標更新
				WriteText[0] = Text[SceneCount][TextCount+Line][LoopCount];												//1byte目代入
				WriteText[1] = Text[SceneCount][TextCount+Line][LoopCount+1];											//2byte目代入
				WriteText[2] = '\0';																					//ヌル文字を代入
				//DrawStringToHandle(DrawX+WriteX,DrawY + ( LineSpace * Line ),WriteText,GetColor(200,200,200),TextFontHandle);	//一文字描画
				DrawStringShadow(DrawX+WriteX,DrawY + ( LineSpace * Line ),WriteText,GetColor(233,233,233),GetColor(5,5,5));
				LoopCount+=2;																							//一文字分カウントアップ
			}

			Length = Text[SceneCount][TextCount+Line].length()-2;

			//文字列の終端ならば、書き込み行数を更新
			if( Length <= WriteIndex[Line] ){
				WriteLine = Line+1;					//文字列の終端ならば、書き込み行数を更新
			}else if( WriteCount % DrawSpeed == 0 ) WriteIndex[Line]+=2;


			//もしも全文描画終了フラグが立っているならば,描画カウントを最大にする(文字数を代入)
			if( TextGraphEndFlag == 1 ){
				WriteIndex[Line] = Length;
			}
		}
	}
	
	//描画タイミング動機用
	WriteCount++;
	
	//テキストが全て描画されたら、全文描画終了フラグを立てる
	if( WriteLine == LineNo[SceneCount][SerifCount] ) TextGraphEndFlag = 1;

}
Пример #24
0
/*アイキャッチ*/
 void TextClass::EyeCatching(UserClass &User){
	MouseClass* Mouse = MouseClass::GetInstance();

	const int MinVol    = 9000;
	const int FadeSpeed = 7;

	//static bool SoundBack  = FALSE;
	static bool FirstFlag  = FALSE;
	static bool PlayFlag   = FALSE;
	static bool FadeFlag1  = FALSE;
	static bool FadeFlag2  = TRUE;
	static int FadeCount   = 255;
	static int MovieVol;
	static int MovieHandle;
	static int TmpSoundCode;


	//音量取得
	MovieVol = User.GetBGMVol() * 4;

	//現在のサウンドコードのバックアップ
	//if( SoundBack == FALSE ){
	//	TmpSoundCode = User.GetBGMCode();
	//	SoundBack = TRUE;
	//}

	//音楽停止 
	User.SetBGMCode( GAME_BGM::STOP );

	//フェードアウト処理
	if( FadeFlag1 == FALSE && FadeFlag2 == TRUE ){
		SetDrawBright(FadeCount,FadeCount,FadeCount);
		FadeCount -= FadeSpeed;
		if( FadeCount <= 0 ) FadeFlag1 = TRUE;
	}

	//再生前の初期化
	if( FirstFlag == FALSE && FadeFlag1 == TRUE ){
		SetDrawBright(255,255,255);
		MovieHandle = LoadGraph("./resource/movie/eyecatch.ogv");
		SetMovieVolumeToGraph( MinVol + MovieVol , MovieHandle );
		PlayMovieToGraph( MovieHandle );
		FirstFlag = TRUE;
		PlayFlag  = TRUE;
	}

	//動画再生
	if( PlayFlag == TRUE ){
		DrawGraph(0,0,MovieHandle,TRUE);
		WaitTimer(17);
	}

	//再生中か判断
	if( GetMovieStateToGraph(MovieHandle) != 1 && FadeFlag1 == TRUE ){
		PlayFlag  = FALSE;
		FirstFlag = FALSE;
		FadeFlag1 = FALSE;
		FadeFlag2 = FALSE;
	}

	//フェードイン
	if( FadeFlag2 == FALSE ){
		SetDrawBright(FadeCount,FadeCount,FadeCount);
		FadeCount += FadeSpeed;
		if( FadeCount >= 255 ){
			FadeFlag2 = TRUE;
			//SoundBack = FALSE;
			//User.SetBGMCode( TmpSoundCode );
			WriteMode = NORMAL;
		}
	}


	//メッセージ描画
	//DrawString(300,windowY - windowY / 3 + 50,"アイキャッチだよ、クリックで進むよっ!",GetColor(0,0,0));

	//if( Mouse->GetState(MOUSE::LEFT) == 1 ){
	//	WriteMode = NORMAL;
	//}
}
Пример #25
0
/*バックログから戻ったときに前の制御コードを取得*/
void TextClass::BackCheckControlCode(UserClass &User){
	int TmpSceneCount,TmpTextCount;
	bool BGMFlag  = FALSE;
	bool BackFlag = FALSE;
	bool CharFlag = FALSE;
	std::string BGMCode;
	std::string BackCode;
	std::string CharacterCode;

	TmpSceneCount = SceneCount;
	TmpTextCount  = TextCount;
	
	//曲をいったん停止
	User.SetBGMCode( GAME_BGM::STOP );
	User.SetCharacterCode( GAME_CHAR::NOT );

	while( TmpTextCount >= 0 ){
		//音楽制御
		if( Name[TmpSceneCount][TmpTextCount] == "音楽" && BGMFlag == FALSE){
			//BGMコード受け取り
			BGMCode = Text[TmpSceneCount][TmpTextCount];
			if( BGMCode == "回想" )   User.SetBGMCode( GAME_BGM::KAISOU1 );
			if( BGMCode == "出会い" ) User.SetBGMCode( GAME_BGM::DEAI );
			if( BGMCode == "別れ" )   User.SetBGMCode( GAME_BGM::WAKARE );
			if( BGMCode == "無音" )   User.SetBGMCode( GAME_BGM::STOP );
			if( BGMCode == "残響" )	  User.SetBGMCode( GAME_BGM::TITLE);
			BGMFlag = TRUE;
		}
	
		//背景画像制御
		if( Name[TmpSceneCount][TmpTextCount] == "背景" && BackFlag == FALSE ){
			//背景コード受け取り
			BackCode = Text[TmpSceneCount][TmpTextCount];
			if( BackCode == "暗闇" ) User.SetBackCode( GAME_BACK::BLACK  );
			if( BackCode == "川原" ) User.SetBackCode( GAME_BACK::KAWARA );
			BackFlag = TRUE;
		}
		
		//キャラクタ画像制御
		if( Name[TmpSceneCount][TmpTextCount] == "キャラ"  && CharFlag == FALSE ){
			//キャラクタコード受け取り
			CharacterCode = Text[TmpSceneCount][TmpTextCount];
			if( CharacterCode == "藍"     ) User.SetCharacterCode( GAME_CHAR::AI );
			if( CharacterCode == "非表示" )	User.SetCharacterCode( GAME_CHAR::NOT );
			CharFlag = TRUE;
		}
		
		//カウントを下げる
		TmpTextCount--;
		
		//もしテキストカウントが0を下回ったら各コードを初期化
		if( TmpTextCount < 0 ){
			if( BGMFlag  == FALSE ) User.SetBGMCode( GAME_BGM::STOP );
			if( BackFlag == FALSE ) User.SetBackCode( GAME_BACK::BLACK );
			if( CharFlag == FALSE ) User.SetCharacterCode( GAME_CHAR::NOT );
		}
		
		//全てのコードが確認されたら処理を抜ける
		if( BGMFlag == TRUE && BackFlag == TRUE && CharFlag == TRUE  ) break;

	}
}
Пример #26
0
/*制御コードチェック*/
void TextClass::CheckCotrolCode(UserClass &User){
	//各種コード受け取り変数
	std::string BGMCode;
	std::string BackCode;
	std::string EventCode;
	std::string CharacterCode;

	bool EventFlag = FALSE;

	do{
	
		EventFlag = FALSE;


		//音楽制御
		if( Name[SceneCount][TextCount] == "音楽" ){
			//BGMコード受け取り
			BGMCode = Text[SceneCount][TextCount];
			if( BGMCode == "回想" )   User.SetBGMCode( GAME_BGM::KAISOU1 );
			if( BGMCode == "出会い" ) User.SetBGMCode( GAME_BGM::DEAI );
			if( BGMCode == "別れ" )   User.SetBGMCode( GAME_BGM::WAKARE );
			if( BGMCode == "無音" )   User.SetBGMCode( GAME_BGM::STOP );
			if( BGMCode == "残響" )	  User.SetBGMCode( GAME_BGM::TITLE);
			TextCount++;
			SerifCount++;
			EventFlag = TRUE;
		}

	
		//背景画像制御
		if( Name[SceneCount][TextCount] == "背景" ){
			//背景コード受け取り
			BackCode = Text[SceneCount][TextCount];
			if( BackCode == "暗闇" ) User.SetBackCode( GAME_BACK::BLACK  );
			if( BackCode == "川原" ) User.SetBackCode( GAME_BACK::KAWARA );
			if( BackCode == "夜空" ) User.SetBackCode( GAME_BACK::YOZORA );
			TextCount++;
			SerifCount++;
			EventFlag = TRUE;
		}
		
		//キャラクタ画像制御
		if( Name[SceneCount][TextCount] == "キャラ" ){
			//キャラクタコード受け取り
			CharacterCode = Text[SceneCount][TextCount];
			if( CharacterCode == "藍"     ) User.SetCharacterCode( GAME_CHAR::AI );
			if( CharacterCode == "非表示" )	User.SetCharacterCode( GAME_CHAR::NOT );
			TextCount++;
			SerifCount++;
			EventFlag = TRUE;
		}

		//時間経過
		if( Name[SceneCount][TextCount] == "イベント" ){
			EventCode = Text[SceneCount][TextCount];
			if( EventCode == "経過"       ) OverTime(User);
			if( EventCode == "タイトルへ" ) WriteMode = TITLE;
		}
	
		//エンド
		if( Name[SceneCount][TextCount] == "エンド" ){
			TextCount++;
			SerifCount++;
			WriteMode = END;
		}

	}while( EventFlag == TRUE );
}