HMiscUtils.cpp 7.82 KB
//
//  HMiscUtils.cpp
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 17.05.2017.
//
//

#include <stdio.h>
#include "HMiscUtils.h"
#include "HGeometryUtils.h"
#include "HAlertView.h"
#include "AudioEngine.h"
#include "HSoundUtils.h"
#include "HelloWorldScene.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "RatePromptHandler_ios.h"
#endif
#include "audio/include/AudioEngine.h"

float HMiscUtils::StandardAnimationTime = 0.2;
const std::string HMiscUtils::MAGGIE_TOUCHED_UD_KEY = "MAGGIE_TOUCHED_UD_KEY";
const std::string HMiscUtils::WHICH_LEVEL_UD_KEY = "WHICH_LEVEL_UD_KEY";
const std::string HMiscUtils::TOS_ACCEPTED_UD_KEY = "TOS_ACCEPTED_UD_KEY";
const std::string HMiscUtils::BG_MUSIC_PLAYING_UD_KEY = "BG_MUSIC_PLAYING_UD_KEY";

void HMiscUtils::saveMaggieTouched(){
    cocos2d::UserDefault::getInstance()->setBoolForKey(MAGGIE_TOUCHED_UD_KEY.c_str(), true);
    cocos2d::UserDefault::getInstance()->flush();
}

bool HMiscUtils::wasMaggieTouched(){
    return cocos2d::UserDefault::getInstance()->getBoolForKey(MAGGIE_TOUCHED_UD_KEY.c_str(), false);
}

void HMiscUtils::saveTOSAccepted(){
    cocos2d::UserDefault::getInstance()->setBoolForKey(TOS_ACCEPTED_UD_KEY.c_str(), true);
    cocos2d::UserDefault::getInstance()->flush();
}

bool HMiscUtils::wasTOSAccepted(){
    return cocos2d::UserDefault::getInstance()->getBoolForKey(TOS_ACCEPTED_UD_KEY.c_str(), false);
}

void HMiscUtils::saveBgMusicPlaying(bool bgMusicPlaying){
    cocos2d::UserDefault::getInstance()->setBoolForKey(BG_MUSIC_PLAYING_UD_KEY.c_str(), bgMusicPlaying);
    cocos2d::UserDefault::getInstance()->flush();
}

bool HMiscUtils::shouldBgMusicPlay(){
    return cocos2d::UserDefault::getInstance()->getBoolForKey(BG_MUSIC_PLAYING_UD_KEY.c_str(), true);
}

//void HMiscUtils::saveLastLevel(Level level){
//    cocos2d::UserDefault::getInstance()->setIntegerForKey(WHICH_LEVEL_UD_KEY.c_str(), (int)level);
//}

void HMiscUtils::saveLastLevel(int level){
    cocos2d::UserDefault::getInstance()->setIntegerForKey(WHICH_LEVEL_UD_KEY.c_str(), level);
    cocos2d::UserDefault::getInstance()->flush();
}

HMiscUtils::Level HMiscUtils::lastLevel(){
    return (Level)cocos2d::UserDefault::getInstance()->getIntegerForKey(WHICH_LEVEL_UD_KEY.c_str(), (int)Level::TEEN);
}

int HMiscUtils::nextLevel(){
    return MIN((int)lastLevel() + 1, (int)Level::ADULT);
}

static int FadeAnimationTag = 88;
void HMiscUtils::showView(cocos2d::Node* node, bool animated, float toAlpha){
    node->stopActionByTag(FadeAnimationTag);
    node->setVisible(true);
    if(animated){
        auto fadeAction = cocos2d::FadeTo::create(StandardAnimationTime, toAlpha);
        fadeAction->setTag(FadeAnimationTag);
        node->runAction(fadeAction);
    } else {
        node->setOpacity(toAlpha);
    }
}

void HMiscUtils::hideView(cocos2d::Node* node, bool animated){
    node->stopActionByTag(FadeAnimationTag);
    if(animated){
        auto fadeAction = cocos2d::Sequence::create(cocos2d::FadeOut::create(StandardAnimationTime),
                                                  cocos2d::CallFunc::create(std::bind([&](cocos2d::Node* n){
            n->setVisible(false);
        },node)),
                                                    nullptr);
        fadeAction->setTag(FadeAnimationTag);
        node->runAction(fadeAction);
    } else {
        node->setVisible(false);
    }
}

void HMiscUtils::hideAndRemoveView(cocos2d::Node* node, bool animated){
    if(animated){
        node->runAction(cocos2d::Sequence::create(cocos2d::FadeOut::create(StandardAnimationTime),
                                              cocos2d::CallFunc::create(std::bind([&](cocos2d::Node* n){
                                                n->removeFromParent();
                                                },node)),
                                              nullptr));
    } else {
        node->removeFromParent();
    }
}

cocos2d::Rect HMiscUtils::getExtendedActiveArea(cocos2d::Node* object, float extendPercentValueX, float extendPercentValueY, ExtendDirectionX extendDirX, ExtendDirectionY extendDirY)
{
    auto objectBoundingBox = HGeometryUtils::getBoundingBoxToWorld(object);
    
    if(extendPercentValueX == 0 && extendPercentValueY == 0){
        return objectBoundingBox;
    }
    
    auto extendValueX = objectBoundingBox.size.width*extendPercentValueX/100.0;
    auto extendValueY = objectBoundingBox.size.height*extendPercentValueY/100.0;
    
    auto x = objectBoundingBox.origin.x;
    auto y = objectBoundingBox.origin.y;
    auto w = objectBoundingBox.size.width;
    auto h = objectBoundingBox.size.height;
    
    switch(extendDirX){
        case ExtendDirectionX::LEFT:
            x -= extendValueX;
            w += extendValueX;
            break;
        case ExtendDirectionX::RIGHT:
            w += extendValueX;
            break;
        case ExtendDirectionX::BOTH:
            x -= extendValueX/2;
            w += extendValueX;
            break;
    }
    
    switch(extendDirY){
        case ExtendDirectionY::DOWN:
            y -= extendValueY;
            h += extendValueY;
            break;
        case ExtendDirectionY::UP:
            h += extendValueY;
            break;
        case ExtendDirectionY::BOTH:
            y -= extendValueY/2;
            h += extendValueY;
            break;
    }
    
    return cocos2d::Rect(x, y, w, h);
}

bool HMiscUtils::isNodeVisible(cocos2d::Node* node){
    bool ret = true;
    cocos2d::Node* parent = node;
    while (parent != nullptr) {
        if(!parent->isVisible()){
            ret = false;
            break;
        } else {
            parent = parent->getParent();
        }
    }
    return ret;
}

static const int HAlertViewTag = 999;

void HMiscUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallback){

    if(cocos2d::Director::getInstance()->getRunningScene()->getChildByTag(HAlertViewTag) == nullptr) {

        auto alpha = 220;

        auto message = "Are you sure you want to quit?"; //TODO
        auto okText = "Yes, bye!";
        auto cancelText = "No, let's play!";

        auto cancelColor = cocos2d::Color3B(68, 200, 220);
        auto okColor = cocos2d::Color3B(200, 100, 100);

        auto alert = HAlertView::create(message, okText, cancelText, okColor, cancelColor, []() {
//            HSoundUtils::stopAllSounds(); //todo dedup in other places?
//            cocoss2d::AudioEngine::end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
            cocos2d::Director::getInstance()->end();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
            cocos2d::AudioEngine::stopAll();
            cocos2d::Director::getInstance()->pause();
            handler_nativeExitGame();
#else
            cocos2d::Director::getInstance()->end();
#endif
            
              // create a scene. it's an autorelease object
            //auto scene = HelloWorld::createScene();
            // run
            //cocos2d::Director::getInstance()->replaceScene(scene);



        }, onCancelCallback);
        auto touchListener = cocos2d::EventListenerTouchOneByOne::create();
        touchListener->setSwallowTouches(true);
        touchListener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event) {
            return true;
        };
        cocos2d::Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touchListener, alert);
        alert->setTag(HAlertViewTag);
        alert->setLocalZOrder(1000); //TODO make general zorders, named
        alert->setOpacity(0);
        cocos2d::Director::getInstance()->getRunningScene()->addChild(alert);
        alert->runAction(cocos2d::FadeTo::create(HMiscUtils::StandardAnimationTime, alpha));
    }
}

bool HMiscUtils::closeAppCloseConfirmDialogIfNecessary(){
    auto alertNode = cocos2d::Director::getInstance()->getRunningScene()->getChildByTag(HAlertViewTag);
    if(alertNode != nullptr) {
        alertNode->removeFromParent();
        return true;
    }
    return false;
}