From 2cb2782c9d6fd83c9ce0f9fcf35633a54c99b9f7 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Mon, 28 Sep 2015 22:08:04 +0200 Subject: [PATCH] Restored old Ceebot-Teen objects In preparations for new programming course --- data | 2 +- src/CMakeLists.txt | 1 + src/graphics/engine/particle.cpp | 6 +- src/graphics/engine/pyro.cpp | 27 +- src/level/parser/parserparam.cpp | 90 ++++ src/object/auto/autokid.cpp | 204 +++++++ src/object/auto/autokid.h | 48 ++ src/object/object_factory.cpp | 846 ++++++++++++++++++++++++++++++ src/object/object_factory.h | 1 + src/object/object_type.h | 45 ++ src/object/old_object.cpp | 3 +- src/object/task/taskterraform.cpp | 5 +- src/script/cbottoken.cpp | 1 + src/ui/controls/map.cpp | 26 +- 14 files changed, 1294 insertions(+), 11 deletions(-) create mode 100644 src/object/auto/autokid.cpp create mode 100644 src/object/auto/autokid.h diff --git a/data b/data index 14518ff4..d90d0da9 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit 14518ff47694de5bf13a5f43826187cf3d8e40a1 +Subproject commit d90d0da944ad77e461dbc7b623491016f952fc21 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5e445a98..53865091 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -147,6 +147,7 @@ set(BASE_SOURCES object/auto/autoflag.cpp object/auto/autohouston.cpp object/auto/autojostle.cpp + object/auto/autokid.cpp object/auto/autolabo.cpp object/auto/automush.cpp object/auto/autonest.cpp diff --git a/src/graphics/engine/particle.cpp b/src/graphics/engine/particle.cpp index afd9f4d1..1903554d 100644 --- a/src/graphics/engine/particle.cpp +++ b/src/graphics/engine/particle.cpp @@ -67,7 +67,9 @@ bool IsAlien(ObjectType type) type == OBJECT_NEST || type == OBJECT_BULLET || type == OBJECT_EGG || - type == OBJECT_MOBILEtg ); + type == OBJECT_MOBILEtg || + type == OBJECT_TEEN28 || + type == OBJECT_TEEN31 ); } CParticle::CParticle(CEngine* engine) @@ -3611,6 +3613,8 @@ CObject* CParticle::SearchObjectRay(Math::Vector pos, Math::Vector goal, if ( type == PARTIRAY1 && oType != OBJECT_MOBILEtg && + oType != OBJECT_TEEN28 && + oType != OBJECT_TEEN31 && oType != OBJECT_ANT && oType != OBJECT_SPIDER && oType != OBJECT_BEE && diff --git a/src/graphics/engine/pyro.cpp b/src/graphics/engine/pyro.cpp index 68038902..a0f962cf 100644 --- a/src/graphics/engine/pyro.cpp +++ b/src/graphics/engine/pyro.cpp @@ -119,6 +119,12 @@ bool CPyro::Create(PyroType type, CObject* obj, float force) m_lastParticleSmoke = 0.0f; m_lightRank = -1; + if ( oType == OBJECT_TEEN28 || + oType == OBJECT_TEEN31 ) + { + m_pos.y = pos.y+1.0f; + } + // Seeking the position of the battery. CObject* power = nullptr; @@ -456,7 +462,9 @@ bool CPyro::Create(PyroType type, CObject* obj, float force) m_type == PT_FRAGW || m_type == PT_SPIDER || m_type == PT_EGG || - (m_type == PT_EXPLOT && oType == OBJECT_MOBILEtg) ) + (m_type == PT_EXPLOT && oType == OBJECT_MOBILEtg) || + (m_type == PT_EXPLOT && oType == OBJECT_TEEN28 ) || + (m_type == PT_EXPLOT && oType == OBJECT_TEEN31 ) ) { for (int part = 0; part < OBJECTMAXPART; part++) { @@ -1414,7 +1422,8 @@ void CPyro::CreateTriangle(CObject* obj, ObjectType oType, int part) oType == OBJECT_ATOMIC || oType == OBJECT_URANIUM || oType == OBJECT_TNT || - oType == OBJECT_BOMB ) + oType == OBJECT_BOMB || + oType == OBJECT_TEEN28) { percent = 0.75f; } @@ -1720,6 +1729,15 @@ void CPyro::BurnStart() angle.y = 0.0f; angle.z = (Math::Rand()-0.5f)*0.4f; } + else if ( m_burnType == OBJECT_TEEN31 ) // basket? + { + pos.x = 0.0f; + pos.y = 0.0f; + pos.z = 0.0f; + angle.x = (Math::Rand()-0.5f)*0.8f; + angle.y = 0.0f; + angle.z = (Math::Rand()-0.5f)*0.2f; + } else { pos.x = 0.0f; @@ -2094,6 +2112,11 @@ void CPyro::BurnAddPart(int part, Math::Vector pos, Math::Vector angle) void CPyro::BurnProgress() { + if ( m_burnType == OBJECT_TEEN31 ) // basket? + { + m_object->SetScaleY(1.0f-m_progress*0.5f); // slight flattening + } + for (int i = 0; i < m_burnPartTotal; i++) { Math::Vector pos = m_burnPart[i].initialPos + m_progress*(m_burnPart[i].finalPos-m_burnPart[i].initialPos); diff --git a/src/level/parser/parserparam.cpp b/src/level/parser/parserparam.cpp index 1933f843..e6c361ed 100644 --- a/src/level/parser/parserparam.cpp +++ b/src/level/parser/parserparam.cpp @@ -467,6 +467,51 @@ ObjectType CLevelParserParam::ToObjectType(std::string value) if (value == "Barrier1" ) return OBJECT_BARRIER1; if (value == "Barrier2" ) return OBJECT_BARRIER2; if (value == "Barrier3" ) return OBJECT_BARRIER3; + if (value == "Teen0" ) return OBJECT_TEEN0; + if (value == "Teen1" ) return OBJECT_TEEN1; + if (value == "Teen2" ) return OBJECT_TEEN2; + if (value == "Teen3" ) return OBJECT_TEEN3; + if (value == "Teen4" ) return OBJECT_TEEN4; + if (value == "Teen5" ) return OBJECT_TEEN5; + if (value == "Teen6" ) return OBJECT_TEEN6; + if (value == "Teen7" ) return OBJECT_TEEN7; + if (value == "Teen8" ) return OBJECT_TEEN8; + if (value == "Teen9" ) return OBJECT_TEEN9; + if (value == "Teen10" ) return OBJECT_TEEN10; + if (value == "Teen11" ) return OBJECT_TEEN11; + if (value == "Teen12" ) return OBJECT_TEEN12; + if (value == "Teen13" ) return OBJECT_TEEN13; + if (value == "Teen14" ) return OBJECT_TEEN14; + if (value == "Teen15" ) return OBJECT_TEEN15; + if (value == "Teen16" ) return OBJECT_TEEN16; + if (value == "Teen17" ) return OBJECT_TEEN17; + if (value == "Teen18" ) return OBJECT_TEEN18; + if (value == "Teen19" ) return OBJECT_TEEN19; + if (value == "Teen20" ) return OBJECT_TEEN20; + if (value == "Teen21" ) return OBJECT_TEEN21; + if (value == "Teen22" ) return OBJECT_TEEN22; + if (value == "Teen23" ) return OBJECT_TEEN23; + if (value == "Teen24" ) return OBJECT_TEEN24; + if (value == "Teen25" ) return OBJECT_TEEN25; + if (value == "Teen26" ) return OBJECT_TEEN26; + if (value == "Teen27" ) return OBJECT_TEEN27; + if (value == "Teen28" ) return OBJECT_TEEN28; + if (value == "Teen29" ) return OBJECT_TEEN29; + if (value == "Teen30" ) return OBJECT_TEEN30; + if (value == "Teen31" ) return OBJECT_TEEN31; + if (value == "Teen32" ) return OBJECT_TEEN32; + if (value == "Teen33" ) return OBJECT_TEEN33; + if (value == "Stone" ) return OBJECT_TEEN34; + if (value == "Teen35" ) return OBJECT_TEEN35; + if (value == "Teen36" ) return OBJECT_TEEN36; + if (value == "Teen37" ) return OBJECT_TEEN37; + if (value == "Teen38" ) return OBJECT_TEEN38; + if (value == "Teen39" ) return OBJECT_TEEN39; + if (value == "Teen40" ) return OBJECT_TEEN40; + if (value == "Teen41" ) return OBJECT_TEEN41; + if (value == "Teen42" ) return OBJECT_TEEN42; + if (value == "Teen43" ) return OBJECT_TEEN43; + if (value == "Teen44" ) return OBJECT_TEEN44; if (value == "Quartz0" ) return OBJECT_QUARTZ0; if (value == "Quartz1" ) return OBJECT_QUARTZ1; if (value == "Quartz2" ) return OBJECT_QUARTZ2; @@ -617,6 +662,51 @@ const std::string CLevelParserParam::FromObjectType(ObjectType value) if (value == OBJECT_BARRIER1 ) return "Barrier1"; if (value == OBJECT_BARRIER2 ) return "Barrier2"; if (value == OBJECT_BARRIER3 ) return "Barrier3"; + if (value == OBJECT_TEEN0 ) return "Teen0"; + if (value == OBJECT_TEEN1 ) return "Teen1"; + if (value == OBJECT_TEEN2 ) return "Teen2"; + if (value == OBJECT_TEEN3 ) return "Teen3"; + if (value == OBJECT_TEEN4 ) return "Teen4"; + if (value == OBJECT_TEEN5 ) return "Teen5"; + if (value == OBJECT_TEEN6 ) return "Teen6"; + if (value == OBJECT_TEEN7 ) return "Teen7"; + if (value == OBJECT_TEEN8 ) return "Teen8"; + if (value == OBJECT_TEEN9 ) return "Teen9"; + if (value == OBJECT_TEEN10 ) return "Teen10"; + if (value == OBJECT_TEEN11 ) return "Teen11"; + if (value == OBJECT_TEEN12 ) return "Teen12"; + if (value == OBJECT_TEEN13 ) return "Teen13"; + if (value == OBJECT_TEEN14 ) return "Teen14"; + if (value == OBJECT_TEEN15 ) return "Teen15"; + if (value == OBJECT_TEEN16 ) return "Teen16"; + if (value == OBJECT_TEEN17 ) return "Teen17"; + if (value == OBJECT_TEEN18 ) return "Teen18"; + if (value == OBJECT_TEEN19 ) return "Teen19"; + if (value == OBJECT_TEEN20 ) return "Teen20"; + if (value == OBJECT_TEEN21 ) return "Teen21"; + if (value == OBJECT_TEEN22 ) return "Teen22"; + if (value == OBJECT_TEEN23 ) return "Teen23"; + if (value == OBJECT_TEEN24 ) return "Teen24"; + if (value == OBJECT_TEEN25 ) return "Teen25"; + if (value == OBJECT_TEEN26 ) return "Teen26"; + if (value == OBJECT_TEEN27 ) return "Teen27"; + if (value == OBJECT_TEEN28 ) return "Teen28"; + if (value == OBJECT_TEEN29 ) return "Teen29"; + if (value == OBJECT_TEEN30 ) return "Teen30"; + if (value == OBJECT_TEEN31 ) return "Teen31"; + if (value == OBJECT_TEEN32 ) return "Teen32"; + if (value == OBJECT_TEEN33 ) return "Teen33"; + if (value == OBJECT_TEEN34 ) return "Stone"; + if (value == OBJECT_TEEN35 ) return "Teen35"; + if (value == OBJECT_TEEN36 ) return "Teen36"; + if (value == OBJECT_TEEN37 ) return "Teen37"; + if (value == OBJECT_TEEN38 ) return "Teen38"; + if (value == OBJECT_TEEN39 ) return "Teen39"; + if (value == OBJECT_TEEN40 ) return "Teen40"; + if (value == OBJECT_TEEN41 ) return "Teen41"; + if (value == OBJECT_TEEN42 ) return "Teen42"; + if (value == OBJECT_TEEN43 ) return "Teen43"; + if (value == OBJECT_TEEN44 ) return "Teen44"; if (value == OBJECT_QUARTZ0 ) return "Quartz0"; if (value == OBJECT_QUARTZ1 ) return "Quartz1"; if (value == OBJECT_QUARTZ2 ) return "Quartz2"; diff --git a/src/object/auto/autokid.cpp b/src/object/auto/autokid.cpp new file mode 100644 index 00000000..2cdf3238 --- /dev/null +++ b/src/object/auto/autokid.cpp @@ -0,0 +1,204 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ + + +#include "object/auto/autokid.h" + +#include "graphics/engine/particle.h" +#include "graphics/engine/water.h" + +#include "object/old_object.h" + +#include "sound/sound.h" + +#include + + +// Object's constructor. + +CAutoKid::CAutoKid(COldObject* object) : CAuto(object) +{ + m_soundChannel = -1; + Init(); +} + +// Object's constructor. + +CAutoKid::~CAutoKid() +{ + if ( m_soundChannel != -1 ) + { + m_sound->FlushEnvelope(m_soundChannel); + m_sound->AddEnvelope(m_soundChannel, 0.0f, 1.0f, 1.0f, SOPER_STOP); + m_soundChannel = -1; + } +} + + +// Destroys the object. + +void CAutoKid::DeleteObject(bool bAll) +{ + CAuto::DeleteObject(bAll); +} + + +// Initialize the object. + +void CAutoKid::Init() +{ + Math::Vector pos; + + m_speed = 1.0f/1.0f; + m_progress = 0.0f; + m_lastParticle = 0.0f; + + if ( m_type == OBJECT_TEEN36 ) // trunk ? + { + pos = m_object->GetPosition(); + m_speed = 1.0f/(1.0f+(Math::Mod(pos.x/10.0f-0.5f, 1.0f)*0.2f)); + m_progress = Math::Mod(pos.x/10.0f, 1.0f); + } + + if ( m_type == OBJECT_TEEN37 ) // boat? + { + pos = m_object->GetPosition(); + m_speed = 1.0f/(1.0f+(Math::Mod(pos.x/10.0f-0.5f, 1.0f)*0.2f))*2.5f; + m_progress = Math::Mod(pos.x/10.0f, 1.0f); + } + + if ( m_type == OBJECT_TEEN38 ) // fan? + { + if ( m_soundChannel == -1 ) + { +//? m_soundChannel = m_sound->Play(SOUND_MANIP, m_object->GetPosition(0), 1.0f, 0.5f, true); + m_bSilent = false; + } + } +} + + +// Management of an event. + +bool CAutoKid::EventProcess(const Event &event) +{ + Math::Vector vib, pos, speed; + Math::Point dim; + + CAuto::EventProcess(event); + + if ( m_soundChannel != -1 ) + { + if ( m_engine->GetPause() ) + { + if ( !m_bSilent ) + { + m_sound->AddEnvelope(m_soundChannel, 0.0f, 0.5f, 0.1f, SOPER_CONTINUE); + m_bSilent = true; + } + } + else + { + if ( m_bSilent ) + { + m_sound->AddEnvelope(m_soundChannel, 1.0f, 0.5f, 0.1f, SOPER_CONTINUE); + m_bSilent = false; + } + } + } + + if ( m_engine->GetPause() ) return true; + if ( event.type != EVENT_FRAME ) return true; + + m_progress += event.rTime*m_speed; + + if ( m_type == OBJECT_TEEN36 ) // trunk? + { + vib.x = 0.0f; + vib.y = sinf(m_progress)*1.0f; + vib.z = 0.0f; + m_object->SetLinVibration(vib); + + vib.x = 0.0f; + vib.y = 0.0f; + vib.z = sinf(m_progress*0.5f)*0.05f; + m_object->SetCirVibration(vib); + + if ( m_lastParticle+m_engine->ParticleAdapt(0.15f) <= m_time ) + { + m_lastParticle = m_time; + + pos = m_object->GetPosition(); + pos.y = m_water->GetLevel()+1.0f; + pos.x += (Math::Rand()-0.5f)*50.0f; + pos.z += (Math::Rand()-0.5f)*50.0f; + speed.y = 0.0f; + speed.x = 0.0f; + speed.z = 0.0f; + dim.x = 50.0f; + dim.y = dim.x; + m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIFLIC, 3.0f, 0.0f, 0.0f); + } + } + + if ( m_type == OBJECT_TEEN37 ) // boat? + { + vib.x = 0.0f; + vib.y = sinf(m_progress)*1.0f; + vib.z = 0.0f; + m_object->SetLinVibration(vib); + + vib.x = 0.0f; + vib.y = 0.0f; + vib.z = sinf(m_progress*0.5f)*0.15f; + m_object->SetCirVibration(vib); + + if ( m_lastParticle+m_engine->ParticleAdapt(0.15f) <= m_time ) + { + m_lastParticle = m_time; + + pos = m_object->GetPosition(); + pos.y = m_water->GetLevel()+1.0f; + pos.x += (Math::Rand()-0.5f)*20.0f; + pos.z += (Math::Rand()-0.5f)*20.0f; + speed.y = 0.0f; + speed.x = 0.0f; + speed.z = 0.0f; + dim.x = 20.0f; + dim.y = dim.x; + m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIFLIC, 3.0f, 0.0f, 0.0f); + } + } + + if ( m_type == OBJECT_TEEN38 ) // fan? + { + m_object->SetPartRotationY(1, sinf(m_progress*0.6f)*0.4f); + m_object->SetPartRotationX(2, m_progress*5.0f); + } + + return true; +} + + +// Returns an error due the state of the automation. + +Error CAutoKid::GetError() +{ + return ERR_OK; +} diff --git a/src/object/auto/autokid.h b/src/object/auto/autokid.h new file mode 100644 index 00000000..605587c9 --- /dev/null +++ b/src/object/auto/autokid.h @@ -0,0 +1,48 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ + +// autokid.h + +#pragma once + + +#include "object/auto/auto.h" + + +class CAutoKid : public CAuto +{ +public: + CAutoKid(COldObject* object); + ~CAutoKid(); + + void DeleteObject(bool bAll=false); + + void Init(); + bool EventProcess(const Event &event); + Error GetError(); + +protected: + +protected: + float m_speed; + float m_progress; + float m_lastParticle; + int m_soundChannel; + bool m_bSilent; +}; diff --git a/src/object/object_factory.cpp b/src/object/object_factory.cpp index 484d6a28..b8f86f4c 100644 --- a/src/object/object_factory.cpp +++ b/src/object/object_factory.cpp @@ -38,6 +38,7 @@ #include "object/auto/autoegg.h" #include "object/auto/autoflag.h" #include "object/auto/autojostle.h" +#include "object/auto/autokid.h" #include "object/auto/automush.h" #include "object/auto/autoroot.h" @@ -182,6 +183,53 @@ CObjectUPtr CObjectFactory::CreateObject(const ObjectCreateParams& params) case OBJECT_MUSHROOM2: return CreateMushroom(params); + case OBJECT_TEEN0: + case OBJECT_TEEN1: + case OBJECT_TEEN2: + case OBJECT_TEEN3: + case OBJECT_TEEN4: + case OBJECT_TEEN5: + case OBJECT_TEEN6: + case OBJECT_TEEN7: + case OBJECT_TEEN8: + case OBJECT_TEEN9: + case OBJECT_TEEN10: + case OBJECT_TEEN11: + case OBJECT_TEEN12: + case OBJECT_TEEN13: + case OBJECT_TEEN14: + case OBJECT_TEEN15: + case OBJECT_TEEN16: + case OBJECT_TEEN17: + case OBJECT_TEEN18: + case OBJECT_TEEN19: + case OBJECT_TEEN20: + case OBJECT_TEEN21: + case OBJECT_TEEN22: + case OBJECT_TEEN23: + case OBJECT_TEEN24: + case OBJECT_TEEN25: + case OBJECT_TEEN26: + case OBJECT_TEEN27: + case OBJECT_TEEN28: + case OBJECT_TEEN29: + case OBJECT_TEEN30: + case OBJECT_TEEN31: + case OBJECT_TEEN32: + case OBJECT_TEEN33: + case OBJECT_TEEN34: + case OBJECT_TEEN35: + case OBJECT_TEEN36: + case OBJECT_TEEN37: + case OBJECT_TEEN38: + case OBJECT_TEEN39: + case OBJECT_TEEN40: + case OBJECT_TEEN41: + case OBJECT_TEEN42: + case OBJECT_TEEN43: + case OBJECT_TEEN44: + return CreateTeen(params); + case OBJECT_QUARTZ0: case OBJECT_QUARTZ1: case OBJECT_QUARTZ2: @@ -845,6 +893,798 @@ CObjectUPtr CObjectFactory::CreateMushroom(const ObjectCreateParams& params) return std::move(obj); } +// Creates a toy placed on the ground. + +CObjectUPtr CObjectFactory::CreateTeen(const ObjectCreateParams& params) +{ + Math::Vector pos = params.pos; + float angle = params.angle; + float height = params.height; + ObjectType type = params.type; + int option = params.option; + + COldObjectUPtr obj{new COldObject(params.id)}; + + obj->SetType(type); + obj->SetOption(option); + + float fShadow = Math::Norm(1.0f-height/10.0f); + bool floorAdjust = true; + + if ( type == OBJECT_TEEN0 ) // orange pencil lg=10 + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen0.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 5.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 2.5f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-2.5f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + + obj->CreateShadowCircle(5.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM); + } + + if ( type == OBJECT_TEEN1 ) // blue pencil lg=14 + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen1.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 6.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 2.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-2.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-4.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-6.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + + obj->CreateShadowCircle(6.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM); + } + + if ( type == OBJECT_TEEN2 ) // red pencil lg=16 + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen2.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 7.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.7f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 2.3f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-2.3f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-4.7f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-7.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + + obj->CreateShadowCircle(6.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM); + } + + if ( type == OBJECT_TEEN3 ) // jar with pencils + { + int rank = m_engine->CreateObject(); +//? m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_METAL); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen3.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 0.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 4.0f, 0.0f), 4.0f)); + obj->CreateShadowCircle(6.0f, 0.5f*fShadow); + } + + if ( type == OBJECT_TEEN4 ) // scissors + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen4.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-9.0f, 1.0f, 0.0f), 1.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-6.0f, 1.0f, 0.0f), 1.1f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-3.0f, 1.0f, 0.0f), 1.2f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 1.0f, 0.0f), 1.3f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 5.1f, 1.0f,-1.3f), 2.6f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 8.0f, 1.0f, 2.2f), 2.3f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 9.4f, 1.0f,-2.0f), 2.0f, SOUND_BOUMm, 0.45f)); + + obj->CreateShadowCircle(10.0f, 0.5f*fShadow, Gfx::ENG_SHADOW_WORM); + } + + if ( type == OBJECT_TEEN5 ) // CD + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen5.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + obj->SetFloorHeight(0.0f); + floorAdjust = false; + + m_terrain->AddBuildingLevel(pos, 5.9f, 6.1f, 0.2f, 0.5f); + obj->CreateShadowCircle(8.0f, 0.2f*fShadow); + } + + if ( type == OBJECT_TEEN6 ) // book 1 + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen6.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + + obj->CreateShadowCircle(20.0f, 0.2f*fShadow); + } + + if ( type == OBJECT_TEEN7 ) // book 2 + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen7.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + + obj->CreateShadowCircle(20.0f, 0.2f*fShadow); + } + + if ( type == OBJECT_TEEN8 ) // a stack of books 1 + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen8.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 10.0f, 0.0f), 12.0f)); + obj->CreateShadowCircle(20.0f, 0.2f*fShadow); + } + + if ( type == OBJECT_TEEN9 ) // a stack of books 2 + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen9.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-5.0f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 4.5f, 3.0f,-7.5f), 5.0f, SOUND_BOUMm, 0.45f)); + + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 10.0f, 0.0f), 12.0f)); + obj->CreateShadowCircle(20.0f, 0.2f*fShadow); + } + + if ( type == OBJECT_TEEN10 ) // bookcase + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen10.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-26.0f, 3.0f, 0.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-15.0f, 3.0f,-4.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-15.0f, 3.0f, 5.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( -4.0f, 3.0f,-4.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( -4.0f, 3.0f, 5.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 6.0f, 3.0f,-4.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 6.0f, 3.0f, 4.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 14.0f, 3.0f,-3.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 14.0f, 3.0f, 2.0f), 6.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 24.0f, 3.0f, 5.0f), 6.0f, SOUND_BOUMm, 0.45f)); + + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 6.0f, 0.0f), 20.0f)); + obj->CreateShadowCircle(40.0f, 0.2f*fShadow); + } + + if ( type == OBJECT_TEEN11 ) // lamp + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen11.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + obj->SetFloorHeight(0.0f); + + Math::Matrix* mat = obj->GetWorldMatrix(0); + pos = Math::Transform(*mat, Math::Vector(-56.0f, 22.0f, 0.0f)); + m_particle->CreateParticle(pos, Math::Vector(0.0f, 0.0f, 0.0f), Math::Point(20.0f, 20.0f), Gfx::PARTISELY, 1.0f, 0.0f, 0.0f); + + pos = Math::Transform(*mat, Math::Vector(-65.0f, 40.0f, 0.0f)); + /* TODO: ? + Gfx::Color color; + color.r = 4.0f; + color.g = 2.0f; + color.b = 0.0f; // yellow-orange + color.a = 0.0f; + m_main->CreateSpot(pos, color); + */ + } + + if ( type == OBJECT_TEEN12 ) // coke + { + int rank = m_engine->CreateObject(); +//? m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_METAL); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen12.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 0.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 9.0f, 0.0f), 5.0f)); + obj->CreateShadowCircle(4.5f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN13 ) // cardboard farm + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen13.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 15.0f)); + obj->CreateShadowCircle(20.0f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN14 ) // open box + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen14.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 15.0f)); + obj->CreateShadowCircle(20.0f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN15 ) // stack of cartons + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen15.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f,-7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 0.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 4.0f, 7.0f), 5.0f, SOUND_BOUMm, 0.45f)); + + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 5.0f, 0.0f), 15.0f)); + obj->CreateShadowCircle(20.0f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN16 ) // watering can + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen16.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-8.0f, 4.0f, 0.0f), 12.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 8.0f, 4.0f, 0.0f), 12.0f, SOUND_BOUMm, 0.45f)); + + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 13.0f, 0.0f), 20.0f)); + obj->CreateShadowCircle(18.0f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN17 ) // wheel | + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen17.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 31.0f, 0.0f), 31.0f, SOUND_BOUMm, 0.45f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 31.0f, 0.0f), 31.0f)); + obj->CreateShadowCircle(24.0f, 0.5f*fShadow); + } + + if ( type == OBJECT_TEEN18 ) // wheel / + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen18.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 31.0f, 0.0f), 31.0f, SOUND_BOUMm, 0.45f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 31.0f, 0.0f), 31.0f)); + obj->CreateShadowCircle(24.0f, 0.5f*fShadow); + } + + if ( type == OBJECT_TEEN19 ) // wheel = + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen19.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 10.0f, 0.0f), 32.0f, SOUND_BOUMm, 0.45f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 10.0f, 0.0f), 32.0f)); + obj->CreateShadowCircle(33.0f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN20 ) // wall with shelf + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen20.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-175.0f, 0.0f, -5.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-175.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( -55.0f, 0.0f, -5.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( -55.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( -37.0f, 0.0f, -5.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( -37.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 83.0f, 0.0f, -5.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 83.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f)); + } + + if ( type == OBJECT_TEEN21 ) // wall with window + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen21.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + } + + if ( type == OBJECT_TEEN22 ) // wall with door and shelf + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen22.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-135.0f, 0.0f, -5.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-135.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( -15.0f, 0.0f, -5.0f), 4.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( -15.0f, 0.0f, -35.0f), 4.0f, SOUND_BOUMm, 0.45f)); + } + + if ( type == OBJECT_TEEN23 ) // skateboard on wheels + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen23.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + if ( option == 1 ) // passage under the prohibited skateboard? + { + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 2.0f, 0.0f), 11.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 10.0f, 2.0f, 0.0f), 11.0f, SOUND_BOUMm, 0.45f)); + } + + obj->AddCrashSphere(CrashSphere(Math::Vector(-23.0f, 2.0f, 7.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-23.0f, 2.0f, 0.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-23.0f, 2.0f,-7.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 23.0f, 2.0f, 7.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 23.0f, 2.0f, 0.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 23.0f, 2.0f,-7.0f), 3.0f, SOUND_BOUMm, 0.45f)); + + obj->CreateShadowCircle(35.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM); + } + + if ( type == OBJECT_TEEN24 ) // skate / + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen24.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-12.0f, 0.0f, -3.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-12.0f, 0.0f, 3.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->CreateShadowCircle(20.0f, 0.2f*fShadow); + } + + if ( type == OBJECT_TEEN25 ) // skate / + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen25.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-12.0f, 0.0f, -3.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-12.0f, 0.0f, 3.0f), 3.0f, SOUND_BOUMm, 0.45f)); + obj->CreateShadowCircle(20.0f, 0.2f*fShadow); + } + + if ( type == OBJECT_TEEN26 ) // ceiling lamp + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen26.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + obj->SetFloorHeight(0.0f); + + Math::Matrix* mat = obj->GetWorldMatrix(0); + pos = Math::Transform(*mat, Math::Vector(0.0f, 50.0f, 0.0f)); + m_particle->CreateParticle(pos, Math::Vector(0.0f, 0.0f, 0.0f), Math::Point(100.0f, 100.0f), Gfx::PARTISELY, 1.0f, 0.0f, 0.0f); + + /* TODO: ? + pos = Math::Transform(*mat, Math::Vector(0.0f, 50.0f, 0.0f)); + Gfx::Color color; + color.r = 4.0f; + color.g = 2.0f; + color.b = 0.0f; // yellow-orange + color.a = 0.0f; + m_main->CreateSpot(pos, color); + */ + } + + if ( type == OBJECT_TEEN27 ) // large plant? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen27.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 0.0f, 0.0f), 4.0f, SOUND_BOUM, 0.10f)); + obj->CreateShadowCircle(40.0f, 0.5f); + } + + if ( type == OBJECT_TEEN28 ) // bottle? + { + int rank = m_engine->CreateObject(); +//? m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_METAL); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen28.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 5.0f, SOUND_BOUM, 0.10f)); + obj->CreateShadowCircle(7.0f, 0.6f*fShadow); + } + + if ( type == OBJECT_TEEN29 ) // bridge? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen29.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + floorAdjust = false; + } + + if ( type == OBJECT_TEEN30 ) // jump? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen30.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 4.0f, 0.0f), 15.0f, SOUND_BOUM, 0.10f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 15.0f, 0.0f), 17.0f)); + obj->CreateShadowCircle(20.0f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN31 ) // basket? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen31.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-10.0f, 2.0f, 0.0f), 5.0f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 2.0f, 0.0f), 6.0f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 9.0f, 4.0f, 1.0f), 6.0f, SOUND_BOUM, 0.10f)); + + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 0.0f, 0.0f), 10.0f)); + obj->CreateShadowCircle(16.0f, 0.6f*fShadow); + } + + if ( type == OBJECT_TEEN32 ) // chair? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen32.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector( 17.5f, 1.0f, 17.5f), 3.5f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 17.5f, 1.0f, -17.5f), 3.5f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-17.5f, 1.0f, 17.5f), 3.5f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-17.5f, 1.0f, -17.5f), 3.5f, SOUND_BOUM, 0.10f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 0.0f, 0.0f), 26.0f)); + obj->CreateShadowCircle(35.0f, 0.3f*fShadow); + } + + if ( type == OBJECT_TEEN33 ) // panel? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen33.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 4.0f, SOUND_BOUM, 0.10f)); + obj->CreateShadowCircle(10.0f, 0.3f*fShadow); + } + + if ( type == OBJECT_TEEN34 ) // stone? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen34.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 4.0f, SOUND_BOUM, 0.10f)); + obj->CreateShadowCircle(3.0f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN35 ) // pipe? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen35.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(-40.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector(-20.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 0.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 20.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f)); + obj->AddCrashSphere(CrashSphere(Math::Vector( 40.0f, 5.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f)); + obj->CreateShadowCircle(40.0f, 0.8f*fShadow, Gfx::ENG_SHADOW_WORM); + } + + if ( type == OBJECT_TEEN36 ) // trunk? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen36.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + floorAdjust = false; + } + + if ( type == OBJECT_TEEN37 ) // boat? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen37.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + floorAdjust = false; + } + + if ( type == OBJECT_TEEN38 ) // fan? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen38a.mod", false, rank); + obj->SetPartPosition(0, pos); + obj->SetPartRotationY(0, angle); + + rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); + obj->SetObjectRank(1, rank); + obj->SetObjectParent(1, 0); + m_oldModelManager->AddModelReference("teen38b.mod", false, rank); // engine + obj->SetPartPosition(1, Math::Vector(0.0f, 30.0f, 0.0f)); + + rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); + obj->SetObjectRank(2, rank); + obj->SetObjectParent(2, 1); + m_oldModelManager->AddModelReference("teen38c.mod", false, rank); // propeller + obj->SetPartPosition(2, Math::Vector(0.0f, 0.0f, 0.0f)); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 10.0f, SOUND_BOUM, 0.10f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 2.0f, 0.0f), 10.0f)); + obj->CreateShadowCircle(15.0f, 0.5f*fShadow); + } + + if ( type == OBJECT_TEEN39 ) // potted plant? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen39.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 8.5f, SOUND_BOUM, 0.10f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 2.0f, 0.0f), 8.5f)); + obj->CreateShadowCircle(10.0f, 1.0f*fShadow); + } + + if ( type == OBJECT_TEEN40 ) // balloon? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen40.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 5.0f, 0.0f), 11.0f, SOUND_BOUM, 0.10f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 14.0f, 0.0f), 15.0f)); + obj->CreateShadowCircle(15.0f, 0.7f*fShadow); + } + + if ( type == OBJECT_TEEN41 ) // fence? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen41.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + } + + if ( type == OBJECT_TEEN42 ) // clover? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen42.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 2.0f, SOUND_BOUM, 0.10f)); + obj->CreateShadowCircle(15.0f, 0.4f*fShadow); + } + + if ( type == OBJECT_TEEN43 ) // clover? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen43.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 2.0f, 0.0f), 2.0f, SOUND_BOUM, 0.10f)); + obj->CreateShadowCircle(15.0f, 0.4f*fShadow); + } + + if ( type == OBJECT_TEEN44 ) // car? + { + int rank = m_engine->CreateObject(); + m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX); + obj->SetObjectRank(0, rank); + m_oldModelManager->AddModelReference("teen44.mod", false, rank); + obj->SetPosition(pos); + obj->SetRotationY(angle); + + obj->AddCrashSphere(CrashSphere(Math::Vector(0.0f, 10.0f, 0.0f), 55.0f, SOUND_BOUM, 0.10f)); + obj->SetCameraCollisionSphere(Math::Sphere(Math::Vector(0.0f, 10.0f, 0.0f), 55.0f)); + obj->CreateShadowCircle(55.0f, 1.0f*fShadow); + } + + pos = obj->GetPosition(); + obj->SetPosition(pos); // to display the shadows immediately + + if ( floorAdjust ) + { + obj->SetFloorHeight(0.0f); + obj->FloorAdjust(); + } + + AddObjectAuto(obj.get()); + + pos = obj->GetPosition(); + pos.y += height; + obj->SetPosition(pos); + + return std::move(obj); +} + // Creates a crystal placed on the ground. CObjectUPtr CObjectFactory::CreateQuartz(const ObjectCreateParams& params) @@ -1719,6 +2559,12 @@ void CObjectFactory::AddObjectAuto(COldObject* obj) { objAuto = MakeUnique(obj); } + if ( type == OBJECT_TEEN36 || // trunk? + type == OBJECT_TEEN37 || // boat? + type == OBJECT_TEEN38 ) // fan? + { + objAuto.reset(new CAutoKid(obj)); + } if (objAuto != nullptr) { diff --git a/src/object/object_factory.h b/src/object/object_factory.h index c48b06d5..eed5c818 100644 --- a/src/object/object_factory.h +++ b/src/object/object_factory.h @@ -62,6 +62,7 @@ private: CObjectUPtr CreateBarrier(const ObjectCreateParams& params); CObjectUPtr CreatePlant(const ObjectCreateParams& params); CObjectUPtr CreateMushroom(const ObjectCreateParams& params); + CObjectUPtr CreateTeen(const ObjectCreateParams& params); CObjectUPtr CreateQuartz(const ObjectCreateParams& params); CObjectUPtr CreateRoot(const ObjectCreateParams& params); CObjectUPtr CreateHome(const ObjectCreateParams& params); diff --git a/src/object/object_type.h b/src/object/object_type.h index ea4e8f3b..2186665f 100644 --- a/src/object/object_type.h +++ b/src/object/object_type.h @@ -165,6 +165,51 @@ enum ObjectType OBJECT_RUINconvert = 610, //! < RuinConvert OBJECT_RUINbase = 611, //! < RuinBaseCamp OBJECT_RUINhead = 612, //! < RuinHeadCamp + OBJECT_TEEN0 = 620, //! < Teen0 + OBJECT_TEEN1 = 621, //! < Teen1 + OBJECT_TEEN2 = 622, //! < Teen2 + OBJECT_TEEN3 = 623, //! < Teen3 + OBJECT_TEEN4 = 624, //! < Teen4 + OBJECT_TEEN5 = 625, //! < Teen5 + OBJECT_TEEN6 = 626, //! < Teen6 + OBJECT_TEEN7 = 627, //! < Teen7 + OBJECT_TEEN8 = 628, //! < Teen8 + OBJECT_TEEN9 = 629, //! < Teen9 + OBJECT_TEEN10 = 630, //! < Teen10 + OBJECT_TEEN11 = 631, //! < Teen11 + OBJECT_TEEN12 = 632, //! < Teen12 + OBJECT_TEEN13 = 633, //! < Teen13 + OBJECT_TEEN14 = 634, //! < Teen14 + OBJECT_TEEN15 = 635, //! < Teen15 + OBJECT_TEEN16 = 636, //! < Teen16 + OBJECT_TEEN17 = 637, //! < Teen17 + OBJECT_TEEN18 = 638, //! < Teen18 + OBJECT_TEEN19 = 639, //! < Teen19 + OBJECT_TEEN20 = 640, //! < Teen20 + OBJECT_TEEN21 = 641, //! < Teen21 + OBJECT_TEEN22 = 642, //! < Teen22 + OBJECT_TEEN23 = 643, //! < Teen23 + OBJECT_TEEN24 = 644, //! < Teen24 + OBJECT_TEEN25 = 645, //! < Teen25 + OBJECT_TEEN26 = 646, //! < Teen26 + OBJECT_TEEN27 = 647, //! < Teen27 + OBJECT_TEEN28 = 648, //! < Teen28 + OBJECT_TEEN29 = 649, //! < Teen29 + OBJECT_TEEN30 = 650, //! < Teen30 + OBJECT_TEEN31 = 651, //! < Teen31 + OBJECT_TEEN32 = 652, //! < Teen32 + OBJECT_TEEN33 = 653, //! < Teen33 + OBJECT_TEEN34 = 654, //! < Stone (Teen34) + OBJECT_TEEN35 = 655, //! < Teen35 + OBJECT_TEEN36 = 656, //! < Teen36 + OBJECT_TEEN37 = 657, //! < Teen37 + OBJECT_TEEN38 = 658, //! < Teen38 + OBJECT_TEEN39 = 659, //! < Teen39 + OBJECT_TEEN40 = 660, //! < Teen40 + OBJECT_TEEN41 = 661, //! < Teen41 + OBJECT_TEEN42 = 662, //! < Teen42 + OBJECT_TEEN43 = 663, //! < Teen43 + OBJECT_TEEN44 = 664, //! < Teen44 OBJECT_QUARTZ0 = 700, //! < Quartz0 OBJECT_QUARTZ1 = 701, //! < Quartz1 OBJECT_QUARTZ2 = 702, //! < Quartz2 diff --git a/src/object/old_object.cpp b/src/object/old_object.cpp index 2df77bb4..d327c7a1 100644 --- a/src/object/old_object.cpp +++ b/src/object/old_object.cpp @@ -732,7 +732,8 @@ void COldObject::SetType(ObjectType type) m_type == OBJECT_ANT || m_type == OBJECT_WORM || m_type == OBJECT_SPIDER || - m_type == OBJECT_BEE ) + m_type == OBJECT_BEE || + m_type == OBJECT_TEEN28 ) { m_implementedInterfaces[static_cast(ObjectInterfaceType::Damageable)] = true; m_implementedInterfaces[static_cast(ObjectInterfaceType::Destroyable)] = true; diff --git a/src/object/task/taskterraform.cpp b/src/object/task/taskterraform.cpp index 3b6e6ef3..f761dba8 100644 --- a/src/object/task/taskterraform.cpp +++ b/src/object/task/taskterraform.cpp @@ -363,11 +363,8 @@ bool CTaskTerraform::Terraform() type = pObj->GetType(); if ( type == OBJECT_NULL ) continue; - if ( false ) + if ( type == OBJECT_TEEN34 ) // stone? { - // This was used by Ceebot-Teen to destroy objects hit by the Thumper - // The old Teen objects are removed, but this code might be reused at some point, e.g. to add destruction of resources like empty batteries - dist = Math::Distance(m_terraPos, pObj->GetPosition()); if ( dist > 20.0f ) continue; diff --git a/src/script/cbottoken.cpp b/src/script/cbottoken.cpp index c01b0eca..dc491c55 100644 --- a/src/script/cbottoken.cpp +++ b/src/script/cbottoken.cpp @@ -54,6 +54,7 @@ const char* GetObjectName(ObjectType type) if ( type == OBJECT_TARGET2 ) return "Target2"; if ( type == OBJECT_START ) return "StartArea"; if ( type == OBJECT_END ) return "GoalArea"; + if ( type == OBJECT_TEEN34 ) return "Stone"; if ( type == OBJECT_STONE ) return "TitaniumOre"; if ( type == OBJECT_URANIUM ) return "UraniumOre"; if ( type == OBJECT_METAL ) return "Titanium"; diff --git a/src/ui/controls/map.cpp b/src/ui/controls/map.cpp index 1e964040..c80c631d 100644 --- a/src/ui/controls/map.cpp +++ b/src/ui/controls/map.cpp @@ -619,6 +619,18 @@ void CMap::DrawObject(Math::Point pos, float dir, ObjectType type, MapColor colo dim.x *= 1.4f; dim.y *= 1.4f; } + if ( type == OBJECT_TEEN28 ) // bottle? + { + dim.x *= 3.0f; + dim.y *= 3.0f; + bHilite = true; + } + if ( type == OBJECT_TEEN34 ) // stone? + { + dim.x *= 2.0f; + dim.y *= 2.0f; + bHilite = true; + } if ( color == MAPCOLOR_MOVE && bSelect ) { @@ -868,6 +880,8 @@ void CMap::DrawObjectIcon(Math::Point pos, Math::Point dim, MapColor color, if ( type == OBJECT_SPIDER ) icon = 31; if ( type == OBJECT_BEE ) icon = 31; if ( type == OBJECT_WORM ) icon = 31; + if ( type == OBJECT_TEEN28 ) icon = 48; // bottle + if ( type == OBJECT_TEEN34 ) icon = 48; // stone if ( icon == -1 ) return; m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); @@ -1187,7 +1201,9 @@ void CMap::UpdateObject(CObject* pObj) type == OBJECT_HUSTON || type == OBJECT_TARGET1 || type == OBJECT_START || - type == OBJECT_END ) // stationary object? + type == OBJECT_END || // stationary object? + type == OBJECT_TEEN28 || // bottle? + type == OBJECT_TEEN34 ) // stone? { color = MAPCOLOR_FIX; } @@ -1264,7 +1280,13 @@ void CMap::UpdateObject(CObject* pObj) if (!m_fixImage.empty() && !m_bDebug) // map with still image? { - if ( color != MAPCOLOR_MOVE ) return; + if ( (type == OBJECT_TEEN28 || + type == OBJECT_TEEN34 ) && + m_mode == 0 ) return; + + if ( type != OBJECT_TEEN28 && + type != OBJECT_TEEN34 && + color != MAPCOLOR_MOVE ) return; } if ( pObj->Implements(ObjectInterfaceType::Controllable) && dynamic_cast(pObj)->GetSelect() )